給定奇素數 p,求其原根(本原根)的個數。
素數 p 的原根個數恰為 φ(p-1),其中 φ 為歐拉函數。即 p-1 的質因數分解 p-1 = Π pᵢᵃⁱ,則 φ(p-1) = Π (pᵢᵃⁱ - pᵢᵃⁱ⁻¹) = (p-1) × Π (1 - 1/pᵢ)。
#includeusing namespace std; int main() { long long p; while (cin >> p) { long long n = p - 1; long long ans = n; for (long long i = 2; i * i <= n; ++i) { if (n % i == 0) { ans -= ans / i; // ans *= (1 - 1/i) while (n % i == 0) n /= i; } } if (n > 1) ans -= ans / n; // 剩餘大質因數 cout << ans << '\n'; } return 0; }
質因數分解 O(√n),p ≤ 2³¹-1 時 √n ≤ 46340,極快。多測試用例總時間可忽略。
while(cin>>p)long long 防溢出(p-1 可達 2³¹-2)