我自己写了一个不过好像时间有问题,不过也能过。我找了个大神帮我,但是看不懂,有没有神牛给我讲一下这个代码啊:
#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;
}