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
| #include <bits/stdc++.h> using namespace std; const int maxn = 500000, mod = 19491001; int n, inv[maxn + 10], fac[maxn + 10], ifac[maxn + 10]; int k, d, ans;
inline int add(int x, int y) { x += y; return x < mod ? x : x - mod; } inline int dec(int x, int y) { x -= y; return x < 0 ? x + mod : x; } inline int mul(int x, int y) { return 1ll * x * y % mod; } inline int fpow(int x, int y) { int ans = 1; while (y) { if (y & 1) ans = mul(ans, x); y >>= 1; x = mul(x, x); } return ans; }
void prework() { fac[0] = ifac[0] = 1; for (int i = 1; i <= maxn; ++i) { fac[i] = mul(fac[i - 1], i); inv[i] = i == 1 ? 1 : dec(0, mul(mod / i, inv[mod % i])); ifac[i] = mul(ifac[i - 1], inv[i]); } } inline int comb(int x, int y) { return mul(fac[x], mul(ifac[y], ifac[x - y])); }
int main() { prework(); scanf("%d%d%d", &n, &k, &d); if (d == 1) printf("%d", fpow(k, n)); else if (d == 2) { int wn = fpow(7, (mod - 1) / 2); for (int i = 0; i <= k; ++i) ans = add(ans, mul(comb(k, i), fpow(add(i, mul(wn, k - i)), n))); printf("%d", mul(ans, fpow(fpow(d, k), mod - 2))); } else { int wn = fpow(7, (mod - 1) / 3); for (int i = 0; i <= k; ++i) for (int j = 0; i + j <= k; ++j) ans = add(ans, mul(comb(k, i), mul(comb(k - i, j), fpow(add(i, add(mul(wn, j), mul(mul(wn, wn), k - i - j))), n)))); printf("%d", mul(ans, fpow(fpow(d, k), mod - 2))); } }
|