普通模板
int cnt=0;
memset(book,0,sizeof(book));
book[1]=1;
for(int i=2;i<=maxn;i++)
{
if(!book[i])
{
num[cnt++]=i;
}
for(int j=0;j<cnt&&num[j]*i<=maxn;j++)
{
book[num[j]*i]=1;
if(i%num[j]==0)
break;
}
}
欧拉函数
phi[1] = 1;
for(int i=2;i<=N;i++)
{
if(!vis[i])
{
phi[i] = i-1;
prim[++cnt] = i;
}
for(int j=1;j<=cnt;j++)
{
int tp = prim[j];
if(i*tp>N) break;
vis[i*tp]=true;
if(i%tp==0)
{
phi[i*tp]=phi[i]*tp;
break;
}
else
phi[i*tp]=phi[i]*phi[tp];
}
}
其他,如求2^k
f[1] = 1;
for(int i=2;i<=n;i++){
if(!vis[i]){
vis[i] = 1;
prime[cnt++] = i;
f[i] = qpow(i,k);
}
for(int j=0;j<cnt&&1ll*prime[j]*i<=n;j++){
f[prime[j]*i] = (1ll*f[prime[j]]*f[i])%mod;
vis[prime[j]*i] = 1;
if(i%prime[j]==0)break;
}
}