[联合省选 2020A] 组合数问题 题解

后面有一只大大的组合数,考虑下降幂干过去。\(x^k\) 并不好使,这边考虑转化 \(f(x)=\sum a_ix^i=\sum b_ix^{\underline i}\)

\[\sum_{k=0}^nf(k)x^k\binom nk=\sum_{k=0}^nx^k\sum_{i=0}^mb_ik^{\underline i}\binom nk \]

\[=\sum_{k=0}^nx^k\sum_{i=0}^mb_in^{\underline i}\binom{n-i}{k-i} \]

\[=\sum_{i=0}^mb_in^{\underline i}\sum_{k=0}^{n-i}x^{k+i}\binom{n-i}k \]

\[=\sum_{i=0}^mb_in^{\underline i}x^i(x+1)^{n-i} \]

最后一步的转化是二项式定理。
那现在问题变为如何快速求解 \(b_i\)。考虑第二类斯特林数。

\[\sum_{i=0}^ma_ix^i=\sum_{i=0}^ma_i\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}x^{\underline j} \]

\[=\sum_{i=0}^mx^{\underline i}\sum_{j=i}^ma_j\begin{Bmatrix}j\\i\end{Bmatrix} \]

\[\sum_{i=0}^mb_ix^{\underline i}=\sum_{i=0}^mx^{\underline i}\sum_{j=i}^ma_j\begin{Bmatrix}j\\i\end{Bmatrix} \]

\[b_i=\sum_{j=i}^ma_j\begin{Bmatrix}j\\i\end{Bmatrix} \]

\[\sum_{k=0}^nf(k)x^k\binom nk=\sum_{i=0}^mn^{\underline i}x^i(x+1)^{n-i}\sum_{j=i}^ma_j\begin{Bmatrix}j\\i\end{Bmatrix} \]

那预处理出第二类斯特林数即可。时间复杂度 \(O(m^2)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005;
int n,x,p,m,str[N][N],a[N],ans;
int qpow(int x,int y){
    int re=1;
    while(y){
        if(y&1) re=re*x%p;
        x=x*x%p,y>>=1;
    }return re;
}signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>x>>p>>m,str[0][0]=1;
    for(int i=1;i<=m;i++) for(int j=1;j<=i;j++)
        str[i][j]=(str[i-1][j-1]+j*str[i-1][j])%p;
    for(int i=0;i<=m;i++) cin>>a[i];
    for(int i=0,sum=0;i<=m;i++,sum=0){
        for(int j=i;j<=m;j++)
            sum=(sum+a[j]*str[j][i])%p;
        for(int j=n-i+1;j<=n;j++)
            sum=sum*j%p*x%p;
        ans=(ans+sum*qpow(x+1,n-i))%p;
    }cout<<ans;
    return 0;
}
posted @ 2025-01-23 08:43  长安一片月_22  阅读(19)  评论(0)    收藏  举报