///线性筛选同时得到欧拉函数和线性表数据量可以达到1e7;
///其实都是引用了素数筛的原理(第二个o根号n的算法)
const int maxn=1e7+7;
bool isprime[maxn];
int tot,prime[maxn],phi[maxn];///素数表和每个数的欧拉函数值
///tot为素数的个数
void get_phi_prime()
{
memset(isprime,true,sizeof(isprime));
isprime[0]=isprime[1]=false;
phi[1]=1;tot=0;
for(int i=2;i<=maxn;i++)
{
if(isprime[i]){prime[++tot]=i;phi[i]=i-1;}
for(int j=1;j<=tot;j++)
{
if(prime[j]*i>=maxn) break;
isprime[i*prime[j]]=false;
if(i%prime[j]!=0) phi[i*prime[j]]=phi[i]*(prime[j]-1);
else {phi[i*prime[j]]=phi[i]*prime[j];break;}
}
}
}
线性筛选同时得到欧拉函数表和素数表
最新推荐文章于 2021-01-29 15:23:53 发布