素数筛
int vis[maxn],pri[maxn];
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;
}
}
}
欧拉函数
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);
}
}
}
莫比乌斯函数
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];
}
}
}
约数个数
void initial()
{
cnt=0;
d[1]=1;
for (int i=2 ; i<N ; ++i)
{
if (!mark[i])
{
prim[cnt++]=i;
num[i]=1;
d[i]=2;
}
for (int j=0 ; j<cnt && i*prim[j]<N ; ++j)
{
mark[i*prim[j]]=1;
if (!(i%prim[j]))
{
num[i*prim[j]]=num[i]+1;
d[i*prim[j]]=d[i]/(num[i]+1)*(num[i*prim[j]]+1);
break;
}
d[i*prim[j]]=d[i]*d[prim[j]];
num[i*prim[j]]=1;
}
}
}