严格O(N),即一个最多只被更新一次
int prime[need],tot=0;
bool mark[need];
int get_prime()
{
mark[1]=false;
for(int 2=1,j,temp;i<=need;i++)
{
if(!mark[i]) prime[++tot]=i;
for(int j=1;j<=tot&&(temp=i*prime[j])<=need;j++)
{
mark[temp]=true;
if(i%prime[j]=0) break;
}
}
}
变式:筛质因数个数
void get_cnt()
{
for(int i=2,j,temp;i<=nnn;i++)
{
if(cnt[i]==0)
{
pr[++tot]=i;
cnt[i]=1;
}
for(j=1;j<=tot&&(temp=pr[j]*i)<=nnn;j++)
{
cnt[temp]=cnt[i]+1;
if(i%pr[j]==0) break;
}
}
}