玄学小记.4.5 ~ 一些奇怪的东西
嘿嘿嘿~
#include <bits/stdc++.h> using namespace std; /* \sum_{i=0}^{n-1}i^{k}=\frac{1}{k+1}\sum_{i=0}^{k}\binom{k+1}{i}B_{i}n^{k+1-i} \left\{\begin{matrix} B_{0}=1\\ \sum_{i=0}^{k}\binom{k+1}{i}B_{i}=0\ \end{matrix}\right. B(x)=\frac{x}{e^{x}-1} */ const int G = 3; const int MOD = 998244353; const int N = 1100000; int n, k; int powi(int a, int b) { int c = 1; for (; b; b >>= 1, a = 1ll * a * a % MOD) if (b & 1) c = 1ll * c * a % MOD; return c; } void NTT(int A[], int n, int f) { for (int i = 1; i < n; ++ i) { int j = 0; for (int p = 1, q = n >> 1; p < n; p <<= 1, q >>= 1) if (i & p) j |= q; if (i < j) swap(A[i], A[j]); } for (int i = 2; i <= n; i <<= 1) { int w1 = powi(G, (MOD - 1) / i); if (f < 0) w1 = powi(w1, MOD - 2); for (int j = 0; j < n; j += i) { int w = 1; for (int k = j; k < j + (i >> 1); ++ k) { int u = A[k], v = 1ll * A[k + (i >> 1)] * w % MOD; A[k] = (u + v) % MOD; A[k + (i >> 1)] = (u - v + MOD) % MOD; w = 1ll * w * w1 % MOD; } } } if (f < 0) { int p = powi(n, MOD - 2); for (int i = 0; i < n; ++ i) A[i] = 1ll * A[i] * p % MOD; } } int tmp1[N], tmp2[N], tmp3[N], B[N]; void INV(int F[], int G[], int n) { if (n == 1) { G[0] = powi(F[0], MOD - 2); } else { INV(F, G, n >> 1); for (int i = 0; i < n; ++ i) tmp1[i] = F[i]; for (int i = n; i < (n << 1); ++ i) tmp1[i] = 0; for (int i = 0; i < (n >> 1); ++ i) tmp2[i] = G[i]; for (int i = (n >> 1); i < (n << 1); ++ i) tmp2[i] = 0; NTT(tmp1, n << 1, 1); NTT(tmp2, n << 1, 1); for (int i = 0; i < (n << 1); ++ i) tmp1[i] = (2 * tmp2[i] - 1ll * tmp1[i] * tmp2[i] % MOD * tmp2[i] % MOD + MOD) % MOD; NTT(tmp1, n << 1, -1); for (int i = 0; i < n; ++ i) G[i] = tmp1[i]; } } int fac[N], inv[N]; int res; int main() { scanf("%d%d", &n, &k); int nn = 1; while (nn <= k + 1) nn <<= 1; fac[0] = 1; for (int i = 1; i < nn; ++ i) fac[i] = 1ll * fac[i - 1] * i % MOD; inv[nn - 1] = powi(fac[nn - 1], MOD - 2); for (int i = nn - 2; ~i; -- i) inv[i] = 1ll * inv[i + 1] * (i + 1) % MOD; for (int i = 0; i < nn; ++ i) tmp3[i] = inv[i + 1]; INV(tmp3, B, nn); for (int i = 0; i <= k; ++ i) res = (res + 1ll * fac[k + 1] * inv[k + 1 - i] % MOD * B[i] % MOD * powi(n, k + 1 - i)) % MOD; res = 1ll * res * powi(k + 1, MOD - 2) % MOD; printf("%d\n", res); }
渲染一下~
$$\sum_{i=0}^{n-1}i^{k}=\frac{1}{k+1}\sum_{i=0}^{k}\binom{k+1}{i}B_{i}n^{k+1-i}$$
$$\left\{\begin{matrix} B_{0}=1\\ \sum_{i=0}^{k}\binom{k+1}{i}B_{i}=0\ \end{matrix}\right.$$
$$B(x)=\frac{x}{e^{x}-1}$$
最后这一个是指数函数形式~注意到\(e^x\)可以直接得到,因此只要求个逆就行了~