1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #include <iostream> #include <vector>
using namespace std;
typedef long long ll; typedef __int128_t int128;
const ll MOD = 999999001;
ll power(ll a, ll b) { ll res = 1; a %= MOD; while (b > 0) { if (b & 1) res = (res * a) % MOD; a = (a * a) % MOD; b >>= 1; } return res; }
ll modInverse(ll n) { return power(n, MOD - 2); }
ll geomSum(ll a, ll n) { if (n <= 0) return 0; if (a == 0) return 1; if (a == 1) return (ll)(n % MOD); ll num = (power(a, n) - 1 + MOD) % MOD; ll den = modInverse((a - 1 + MOD) % MOD); return (num * den) % MOD; }
int get_vp(int i, int p) { int count = 0; while (i > 0 && i % p == 0) { count++; i /= p; } return count; }
int main() { const int N = 1000; const int M = 1000;
vector<int> primes; vector<bool> is_prime(N + 1, true); is_prime[0] = is_prime[1] = false; for (int p = 2; p <= N; p++) { if (is_prime[p]) { primes.push_back(p); for (int i = 2 * p; i <= N; i += p) is_prime[i] = false; } }
vector<ll> dp(M, 0); dp[0] = 1;
for (int p : primes) { int128 Ep = 0; for (int i = 1; i <= N; i++) { int vp = get_vp(i, p); if (vp > 0) { int128 term = (int128)(N - i + 1) * (N - i + 2) / 2; Ep += (int128)vp * term; } }
vector<ll> c(M, 0); ll pM = power(p, M); for (int k = 0; k < M; k++) { if ((int128)k > Ep) break; int128 Q = (Ep - k) / M; c[k] = (power(p, k) * geomSum(pM, (ll)(Q + 1))) % MOD; }
vector<ll> next_dp(M, 0); for (int i = 0; i < M; i++) { if (dp[i] == 0) continue; for (int j = 0; j < M; j++) { int target = i + j; if (target >= M) target -= M; next_dp[target] = (next_dp[target] + dp[i] * c[j]) % MOD; } } dp = next_dp; }
cout << "D(1000\bigstar, 1000) mod 999999001 = " << dp[0] << endl;
return 0; }
|