裸的Polya,最后ans/(2*n)mod(1e9+7)时可以用费马小定理

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
ll ipow(ll a, int n) {
ll ans = 1;
while (n) {
if (n & 1) ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int main() {
int T;
ll n, m;
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%lld%lld", &m, &n);
ll ans = 0;
for (int i = 0; i < n; i++) ans = (ans + ipow(m, gcd(i, n)))%mod;
if (n & 1) ans = (ans + n * ipow(m, (n+1)/2)) % mod;
else ans = (ans + n/2 * (ipow(m, (n+2)/2) + ipow(m, n/2))) % mod;
ans = (ans%mod * ipow(2*n, mod-2)%mod)%mod;
printf("Case #%d: %lld\n", kase, ans);
}
return 0;
}