Time Limit: 2000 MS Memory Limit: 65536 K
Total Submissions: 749 (119 users) Accepted: 89 (58 users)
Total Submissions: 749 (119 users) Accepted: 89 (58 users)
Description
请求出区间[A,B]之间的素数的个数。
Input
输入有多组数据。
第一行为正整数T(T<10),表示输入的数据组数。
第二行到第T+1行,每行2个数字A,B(0<A<=B<2^31,且B-A<2^20)表示区间的范围。
Output
输出T行数字,每行只有一个数字,表示对应的素数的个数。
Sample Input
2
100 200
2 1000000
Sample Output
21
78498
#include <iostream> #include <cstring> using namespace std; const int N = 46341; bool isprime[1048576+10]; unsigned int prime[5000]; int Prime() { int i,j,k=0; memset(isprime,1,sizeof(isprime)); for(i=2;i<=N;i++) { if(isprime[i]) { prime[k++]=i; for(j=2*i;j<=N;j+=i) isprime[j]=0; } } return k; } int main () { unsigned int j,t,n,m,ans,i,k,p; p=Prime(); cin>>t; while (t--) { cin>>n>>m; if(n<2) n=2; ans=m-n+1; memset(isprime,1,sizeof(isprime)); for(i=0;i<p&&prime[i]*2<=m;i++) { k=n/prime[i]; if(n%prime[i]) k++; if(k==1) k++; for(j=k*prime[i];j<=m;j+=prime[i]) { if(isprime[j-n]) { ans--; isprime[j-n]=0; } } } cout<<ans<<endl; } }