ll (ll x){ ll i, ans = x; for (i = 2; i*i <= x; i++){ if (x%i == 0) ans = ans - ans / i; while(x%i == 0) x /= i; } if (x > 1) ans = ans - ans / x; return ans; }
递推求欧拉函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
ll _phi(ll x) { //递推求欧拉函数 利用了欧拉函数的积性 //如果b质数 a%b!=0 phi(a*b) = phi(a)*b - phi(a) //当b是质数,a%b==0,phi(a*b)=phi(a)*b if (x == 0) return0; ll res = 1, t = x; for (ll i = 2; i <= (ll)sqrt(1.*x); i++) { if (t%i == 0) { res *= (i - 1); t /= i; while (t%i == 0) { res *= i; t /= i; } } if (t == 1) break; } if (t > 1) { res *= (t - 1); } return res; }
近期评论