1 素数
最初当然是最基本的用来筛素数啦,break保证每个数只被最小的因子筛掉。其他的筛法根据定义来就好了。
void init()
{
for(int i=2;i<=maxn;i++)
{
if(!vis[i])
pri[++pri[0]]=i;
for(int j=1;j<=pri[0]&&i*pri[j]<=maxn;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0)
break;
}
}
}
2 欧拉函数
void init()
{
phi[1]=1;
for(int i=2;i<=maxn;i++)
{
if(!vis[i])
p[++p[0]]=i,phi[i]=i-1;
for(int j=1;j<=p[0]&&i*p[j]<=maxn;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0){phi[i*p[j]]=phi[i]*p[j];break;}
else phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
}
3 莫比乌斯函数
void init()
{
miu[1]=1;
for(int i=2;i<=maxn;i++)
{
if(!is[i]){pri[++tot]=i;miu[i]=-1;}
for(int j=1;j<=tot;j++)
{
int k=i*pri[j];
if(k>maxn) break;
is[k]=1;
if(i%pri[j]==0){miu[k]=0;break;}
else miu[k]=-miu[i];
}
}
}
4 约数个数
以后再填坑(逃)