判斷素數
一個大於5的素數一定在6的倍數週圍
bool is_prime(ll n){
if(n<2) return false;
if(n==2 || n==3) return true;
if(n%6!=1 || n%6!=5) return false;
for(ll i=5;i<=n;i+=6){
if(n%i==0 || n%(i+2)==0)
return false;
}
return true;
}
篩素數
埃拉託斯特尼篩法( O(nloglogn) )
void slove(){
memset(vis,0,sizeof(vis));
ll cnt=0;
for(ll i=2;i<=n;i++){
if(!vis[i]) prime[cnt++]=i;
for(ll j=2*i;j<=n;j+=i){
vis[j]=1;
}
}
}
歐拉篩法( O(n) )
void slove(){
memset(vis,0,sizeof(vis));
ll cnt=0;
for(ll i=2;i<=n;i++){
if(!vis[i]) prime[cnt++]=i;
for(ll j=0;j<cnt;j++){
if(i*prime[j]>n) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}