对于每个 ii11p1p - 1,计算其所有约数的乘积,然后将所有这些乘积相乘,最后对 pp 取模。

每个数 dd 作为约数出现的次数等于有多少个 iidd 的倍数,即 p1d\left\lfloor \dfrac{p - 1}{d} \right\rfloor

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;
}