素数筛选的几个模板
朴素法
bool isPrime(int n)
{
int i,sqr = sqrt((double)n);
for(i=2; i<=sqr; ++i)
{
if ( (n%i) == 0 )
return false;
}
return true;
}
比朴素法更高效的素数筛选
void Set_prime()
{
len=0;
mem(isprime,true);
for(int i=2;i<=N;i++)
{
if(isprime[i])
{
isprime[len++]+=i;
for(int j=i+i;j<=N;j++)
{
isprime[j]=false;is
}
}
}
}
最后一个与上一个效率上没有改进,几乎效率相同。
但思路新颖。
const int N = 1e7+10;
ll mod;
int prime[N+10],cnt;
bool vis[N+10];
bool is_prime(ll x)
{
for(int i=0;i<cnt&&(ll)prime[i]*prime[i]<=x;i++)
{
if(x%prime[i]==0)
return 0;
}
return 1;
}
void get_prime()
{
cnt=0;
for(int i=2;i<=N;i++)// 1要自己特判
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&(ll)i*prime[j]<=N;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}