后面有一只大大的组合数,考虑下降幂干过去。\(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 ix^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 ix^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;
}