进军高级。高级题?。。
欧拉函数(求比它小的数跟它互质的个数)优化polya定理。楼教主的题?。。
#include <iostream> using namespace std; int plist[10000], pcount = 0; int modular_exponent(int a, int b, int n){ //a^b mod n int ret = 1; for (; b; b >>= 1, a = (int) (a)*a%n) if (b & 1) ret = (int) (ret)*a%n; return ret; } int eular(int n){ int ret = 1, i; for (i = 2; i*i <= n; i++) if (n%i == 0){ n /= i, ret *= i - 1; while (n%i == 0) n /= i, ret *= i; } if (n > 1) ret *= n - 1; return ret; } int main() { int t; cin >> t; while (t--) { int n, p; cin >> n >> p; int ans = 0; for (int i = 1; i * i <= n; i++) { if (n % i == 0) { ans = (ans + eular(n / i)%p * modular_exponent(n%p, i - 1, p)) % p; if (i != n / i) //枚举循环长度i,找出相应的i的个数:gcd(n,i)=n/i; ans = (ans + eular(i)%p * modular_exponent(n%p, n / i - 1, p)) % p; } } cout << ans << endl; } } |