埃氏筛素数
•埃氏筛法的基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。
inline ll getprime(ll n)
{
ll k=0;
memset(prime,0,sizeof(prime)); //prime中存放2~n的质数;
memset(vis,0,sizeof(vis)); //vis标记0~n之内不是质数的数;
ll m=sqrt(n+0.5); //优化;
vis[0]=vis[1]=1;
for(int i=2;i<=m;i++)
if(!vis[i])
{
prime[k++]=i;
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
}
for(int i=m+1;i<=n;i++)
if(!vis[i])
prime[k++]=i;
return k;
}
欧拉筛素数(线性筛)
•欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。
inline void getprime(ll n)
{
memset(prime,0,sizeof(prime));
memset(vis,0,sizeof(vis));
vis[0]=vis[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
prime[++prime[0]]=i; //纪录素数, 这个prime[0] 相当于 cnt,用来计数,即prime数组的总个数便是prime【0】;
for(int j=1;j<=prime[0] && i*prime[j]<=n;j++) //循环prime数组里的素数;
{
vis[i*prime[j]]=1; //用prime里面纪录的素数,升序来当做要消去合数的最小素因子。
if(i%prime[j]==0)
break; //防止重复筛查;
}
}
}