分析
划分同余系
代码
#define ll long long
ll pow_mod(ll a, ll b, ll mod) {
ll ans = 1;
a %= mod;
while (b) {
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
int a[1010];
int main()
{
int t, n, m;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
for (int i = 1; i < m; i++) {
if (n >= i)
a[i] = (n - i) / m + 1;
else
a[i] = 0;
}
ll ans = 1;
for (int i = 1; i < m; i++) {
if (a[i] == 0) continue;
ll x = pow_mod(i, i, m);
ll y = pow_mod(i, m, m);
ll s = 0, p = 1;
if (y == 1) {
s = a[i];
} else if (y == 0) {
s = 1;
} else {
s = (pow_mod(y, a[i], (y - 1) * m) - 1 + (y - 1) * m) / (y - 1) % m;
}
x = x * s % m;
//printf("%lld %d\n", x, i);
ans = (ans + x) % m;
}
printf("%lld\n", ans);
}
}