题目描述
给定区间[L,R](L≤R≤2147483647,R-L≤1000000)
,请计算区间中素数的个数。
输入输出格式
输入格式:
两个数L和R。
输出格式:
一行,区间中素数的个数。
输入输出样例
Solution:
本题比较模板(水)。
因为$int_{max}$范围内的合数只需用$sqrt {int_{max}}leq 50000$内的质数就能筛出。
于是,预处理出$50000$内的质数,然后埃式筛掉$[l,r]$范围内的合数就好了,随便瞎搞一下就好了。
最后统计一下质数个数并输出。
代码:
#include<bits/stdc++.h> #define il inline #define ll long long #define For(i,a,b) for(ll (i)=(a);(i)<=(b);(i)++) #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--) using namespace std; const int N=50005,M=1000005; int l,r,prime[N+5],cnt; bool isp[N+5],isprime[M+5]; il void init(){ For(i,2,N){ if(!isp[i]) prime[++cnt]=i; for(int j=1;j<=cnt&&prime[j]*i<=N;j++){ isp[prime[j]*i]=1; if(i%prime[j]==0)break; } } } il void solve(){ ll p,q; For(i,1,cnt){ if(prime[i]>r)break; p=ceil(l*1.0/prime[i]),q=ceil(r*1.0/prime[i]); if(p==1)p=2; for(int j=p;j<=q&&prime[i]*j<=r;j++) isprime[prime[i]*j-l+1]=1; } int tot=0; For(i,1,r-l+1) if(!isprime[i]) tot++; cout<<tot; } int main(){ init(); cin>>l>>r; solve(); return 0; }