- 153's solution
-
题解 P153
- @ 2026-4-5 11:10:13
对于每个 从 到 ,计算其所有约数的乘积,然后将所有这些乘积相乘,最后对 取模。
每个数 作为约数出现的次数等于有多少个 是 的倍数,即 。
AC code:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll qpow(ll a, ll b, ll mod) {
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int main() {
ll p;
cin >> p;
ll m = p - 1;
ll sqrtm = sqrt(m);
ll ans = 1;
for (ll k = 1; k <= sqrtm; k++) {
ll dmax = m / k;
ll dmin = m / (k + 1) + 1;
if (dmin > dmax) continue;
ll prod = 1;
for (ll d = dmin; d <= dmax; d++) {
prod = prod * d % p;
}
ans = ans * qpow(prod, k, p) % p;
}
for (ll d = 1; d <= sqrtm; d++) {
ll k = m / d;
if (k > sqrtm) {
ans = ans * qpow(d, k, p) % p;
}
}
cout << ans;
return 0;
}