玄学小记.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\)可以直接得到,因此只要求个逆就行了~

 

posted @ 2017-11-30 15:02  AwD!  阅读(165)  评论(0)    收藏  举报