RGCDQ
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1320 Accepted Submission(s): 573
In the next T lines, each line contains L, R which is mentioned above.
All input items are integers.
1<= T <= 1000000
2<=L < R<=1000000
See the sample for more details.
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <sstream>
#define PI acos(-1.0)
#define eps 1e-8
#define f 1000010
const int inf = (1<<30) - 10;
using namespace std;
int s[f], p;
int num[f];
int dp[f][8];
void get_prime()
{
int i,j,n,m,s1,s2,a,b;
s[1]=2;
s[2]=3;
m=2;
for(i=6;i<f;i=i+6)
{
a=i-1;
b=i+1;
s1=1;
s2=1;
n=(int)sqrt(m);
for(j=1;j<=n+1;j++)
if(a%s[j]==0){s1=0;break;}
for(j=1;j<=n+1;j++)
if(b%s[j]==0){s2=0;break;}
if(s1!=0){m++;s[m]=a;}
if(s2!=0){m++;s[m]=b;}
}
p = m;
}
void init(){
memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));
for(int i = 1;i <= p; ++i){
for(int j = 1;j*s[i] <= 1000000; ++j){
num[j*s[i]]++;
}
}
for(int i = 2;i <= 1000000; ++i){
for(int j = 1;j <= 7; ++j){
dp[i][j] = dp[i-1][j];
}
dp[i][num[i]]++;
}
}
int main(){
//freopen("input.txt","r",stdin);
get_prime();
init();
int T;
cin>>T;
int l, r;
while(T--){
scanf("%d %d",&l,&r);
int knum[8];
for(int i = 1;i <= 7; ++i){
knum[i] = dp[r][i] - dp[l-1][i];
}
if(knum[7] >= 2){
printf("7\n");
}else if(knum[6]>=2){
printf("6\n");
}else if(knum[5]>=2){
printf("5\n");
}else if(knum[4]>=2){
printf("4\n");
}else if(knum[3]>=2){
printf("3\n");
}else if(knum[6] && knum[3]){
printf("3\n");
}else if(knum[2]>=2){
printf("2\n");
}else if(knum[6] && knum[2]){
printf("2\n");
}else if(knum[4] && knum[2]){
printf("2\n");
}else{
printf("1\n");
}
}
return 0;
}