[清华集训] 如何优雅的求和

题意:求一个m次多项式的\(f(x)\)\((m+1)\)个点值,给定n,p求一个式子的值。

显然当\(f(x) = x\)的时候,就是对\((px + 1 - p)^n\)求期望值,也就是\(np\)

考虑当\(f(x) = \sum A_kx^k(下降幂)\)答案就是$\sum A_kn^k(下降幂)p^k $

\(FFT\)求点值\(A_k\)就可以了,复杂度\(O(m log m)\)

Upd:发现暴力思想也可以...

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353ull;
const int maxn = 2000010;
inline int pow(int a,int b) {
    int res = 1;
    while(b) {
        if(b & 1) res = (long long)res * a % mod;
        a = (long long)a * a % mod;
        b >>= 1;
    }
    return res;
}

int n,m,k;int p = 1;
int f[maxn];
int ans;

signed main () {
    scanf("%d %d %d",&n,&m,&k);
    for(int i = 0;i <= m; ++i) {
        scanf("%d",&f[i]);
    }
    for(int i = 0;i <= m; ++i) {
        (ans += (long long)f[0] * p % mod) %= mod;
        for(int j = 0;j < m - i; ++j) {
            (f[j] = f[j + 1] - f[j] + mod) %= mod;
        }
        p = (long long)p * k % mod * (n - i) % mod * pow(i + 1, mod - 2) % mod;
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/akoasm/p/9418074.html
今日推荐