欧拉函数表(nlognlogn)
int euler[maxn];
void geteuler() {
euler[1] = 1;
for(int i = 2; i < maxn; i++) {
if(!euler[i])
for(int j = i; j < maxn; j+=i) {
if(!euler[j])
euler[j] = j;
euler[j] = euler[j]/i*(i-1);
}
}
}
求单个数的欧拉函数sqrt(n)
ll euler(ll x) {
ll res = x;
for(int i = 2; i <= x; i++) {
if(x%i == 0) {
res -= res/i;
while(x%i == 0) x /= i;
}
}
if(x>1) res -= res/x;
return res;
}
线性筛法(同时得到素数表欧拉函数)当n比较大的时候可用
int phi[maxn+10],prime[maxn+10],tot;
bool mark[maxn+10];
void getphi() {
phi[1] = 1;
for(int i = 2; i < maxn; i++) {
if(!mark[i]) {
prime[++tot]=i;
phi[i]=i-1;
}
for(int j = 1; j <= tot; j++) {
if(i*prime[j] > maxn) break;
mark[i*prime[j]]=1;
if(i%prime[j] == 0)
{phi[i*prime[j]] = phi[i]*prime[j]; break;}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}