标签:class mes cst 因此 质因数 lld int pac sqrt
这个题很明显直接从1-n筛出所有的素数是不现实的,因为数据范围是int的极限,o(n)也做不了
因此我们考虑区间筛,利用一个数最小的质因数一定在sqrt(i)以内的性质,筛出1-sqrt(n)以内的素数同时,去筛n-m到n的素数
#include<iostream> #include<cstdio> using namespace std; long long l,r,ans; bool f1[1000010],f2[1000010]; inline void ask(long long a,long long b) { for(long long i=2;i*i<=b;i++)//枚举因数 { if(!f1[i])//如果这个数是质数(因为之前会把i以内的所有质数筛出来) { for(long long j=2*i;j*j<=b;j+=i) f1[j]=1;//筛sqrt(b)以内的数,以便于筛更大的数 for(long long j=max(2LL,(a+i-1)/i)*i;j<=b;j+=i)//LL是用来强转longlong,(a+i-1)/i*i是为了找到a-b内i的最小倍数 f2[j-a+1]=1; } } for(long long i=1;i<=b-a+1;i++) if(!f2[i]) ans++; } int main() { scanf("%lld%lld",&l,&r); ask(l,r);//区间筛 printf("%d",ans); }
标签:class mes cst 因此 质因数 lld int pac sqrt
原文地址:http://www.cnblogs.com/Loi-dfkdsmbd/p/7738585.html