/* * 试除法求一个数的欧拉函数(也就是求 [1,n] 内与其互素的数的个数) * 2026-03-13: AC https://codeforces.com/gym/106380/submission/366492238 */ longlongeuler_phi(longlong n){ longlong res = n; // p 从 2 开始,逐个递增,试到 sqrt(n) 为止 for (longlong p = 2; p * p <= n; p++) { // 如果 p 能整除 n,那么 p 一定是质数。 // 为什么?因为如果 p 是合数,比如 p = 6 = 2 × 3, // 那么在 p=2 和 p=3 的时候,n 中的 2 和 3 已经被除干净了, // 此时 n 不可能被 6 整除,所以 n % 6 != 0,这个 if 进不来。 // 因此能进到这个 if 里的 p,一定是质因子。 if (n % p == 0) { // 发现质因子 p,对 res 乘上 (1 - 1/p) 这个因子 // 即 res = res / p * (p - 1) res = res / p * (p - 1); // 把 n 中所有的 p 除干净 // 这样后续更大的 p 的倍数就不可能再整除 n 了 while (n % p == 0) n /= p; } } // 循环结束后,如果 n > 1,说明 n 还剩一个大于 sqrt(原始n) 的质因子 // (一个数最多只有一个大于 sqrt 的质因子) if (n > 1) { res = res / n * (n - 1); } return res; }