求助!!!
查看原帖
求助!!!
1468496
skykissheep楼主2025/7/1 15:37

我自己写了一个不过好像时间有问题,不过也能过。我找了个大神帮我,但是看不懂,有没有神牛给我讲一下这个代码啊:

#include <iostream>
#include <vector>
#include <map>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cassert>
using namespace std;

typedef long long ll;

const ll MOD = 1e9 + 7;

ll pow_mod(ll a, ll b, ll mod) {
    ll result = 1;
    a %= mod;
    while (b > 0) {
        if (b % 2 == 1) {
            result = (__int128)result * a % mod;
        }
        a = (__int128)a * a % mod;
        b /= 2;
    }
    return result;
}

ll extended_gcd(ll a, ll b, ll &x, ll &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll gcd = extended_gcd(b, a % b, y, x);
    y -= (a / b) * x;
    return gcd;
}

ll mod_inverse(ll a, ll mod) {
    ll x, y;
    ll g = extended_gcd(a, mod, x, y);
    if (g != 1) return -1;
    return (x % mod + mod) % mod;
}

bool is_prime(ll n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0) return false;
    ll d = n - 1;
    int s = 0;
    while (d % 2 == 0) {
        d /= 2;
        s++;
    }
    vector<ll> a = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
    for (ll x : a) {
        if (x >= n) continue;
        ll t = pow_mod(x, d, n);
        if (t == 1 || t == n - 1) continue;
        bool ok = false;
        for (int j = 0; j < s - 1; j++) {
            t = (__int128)t * t % n;
            if (t == n - 1) {
                ok = true;
                break;
            }
        }
        if (!ok) return false;
    }
    return true;
}

ll pollard_rho(ll n) {
    if (n % 2 == 0) return 2;
    if (n % 3 == 0) return 3;
    if (n % 5 == 0) return 5;
    while (true) {
        ll x = rand() % (n - 2) + 2;
        ll c = rand() % (n - 1) + 1;
        auto f = [=](ll x) { return ((__int128)x * x + c) % n; };
        ll y = x;
        ll g = 1;
        while (g == 1) {
            x = f(x);
            y = f(f(y));
            g = __gcd(abs(x - y), n);
        }
        if (g != n) return g;
    }
}

vector<ll> factorize(ll n) {
    vector<ll> res;
    if (n == 1) return res;
    if (is_prime(n)) {
        res.push_back(n);
        return res;
    }
    ll d = pollard_rho(n);
    vector<ll> v1 = factorize(d);
    vector<ll> v2 = factorize(n / d);
    res.insert(res.end(), v1.begin(), v1.end());
    res.insert(res.end(), v2.begin(), v2.end());
    return res;
}

map<ll, int> get_factors(ll n) {
    map<ll, int> factors;
    if (n == 1) return factors;
    vector<ll> primes = factorize(n);
    for (ll p : primes) {
        factors[p]++;
    }
    return factors;
}

int main() {
    srand(time(0));
    int T;
    cin >> T;
    while (T--) {
        ll n;
        cin >> n;
        int k = 0;
        ll m = n;
        while (m % 2 == 0) {
            k++;
            m /= 2;
        }
        map<ll, int> factors = get_factors(m);
        ll sigma = 1;
        for (auto &entry : factors) {
            ll p = entry.first;
            int e = entry.second;
            ll p_mod = p % MOD;
            ll sum_p;
            if (p_mod == 1) {
                sum_p = (e + 1) % MOD;
            } else {
                ll pow_term = pow_mod(p, e + 1, MOD);
                ll numerator = (pow_term - 1 + MOD) % MOD;
                ll denominator = (p - 1) % MOD;
                ll inv_denominator = mod_inverse(denominator, MOD);
                if (inv_denominator == -1) {
                    assert(false);
                }
                sum_p = (numerator * inv_denominator) % MOD;
            }
            sigma = (sigma * sum_p) % MOD;
        }
        ll ans = (k == 0) ? (8 * sigma) % MOD : (24 * sigma) % MOD;
        cout << ans << endl;
    }
    return 0;
}
2025/7/1 15:37
加载中...