int phi[maxn],miu[maxn],fac[maxn]; ll f[maxn], F[maxn]; void() { for (int i = 1; i < maxn; ++i) fac[i] = i; phi[1] = miu[1] = 1; for (int i = 2; i < maxn; ++i) { if (fac[i] == i) for (int j = i << 1; j < maxn; j += i) fac[j] = i; if (i / fac[i] % fac[i]) phi[i] = (fac[i] - 1)*phi[i / fac[i]], miu[i] = -miu[i / fac[i]]; else phi[i] = fac[i] * phi[i / fac[i]], miu[i] = 0; //当b是质数,a%b==0,phi(a*b)=phi(a)*b } }
求一个数的欧拉函数值–复杂度n^1/2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
intmiu(ll n){ int prime = 1; int flag = 0; for (int i = 2; i*i <= n; i++) { if (n%i == 0) { prime++; n /= i; if (n%i == 0) { flag = 1; break; } } } if (flag) return0; if (prime % 2)return-1; elsereturn1; }
近期评论