1 条题解

  • 0
    @ 2026-4-5 11:10:13

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

    每个数 dd 作为约数出现的次数等于有多少个 ii 是 dd 的倍数,即 ⌊p−1d⌋\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;
    }
    

    信息

    ID
    153
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    3
    已通过
    3
    上传者