后面有一只大大的组合数,考虑下降幂干过去。\(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\)。考虑第二类斯特林数。
那预处理出第二类斯特林数即可。时间复杂度 \(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;
}
标签:ix,ma,省选,题解,sum,int,2020A,Bmatrix,underline
From: https://www.cnblogs.com/chang-an-22-lyh/p/18687060/lianhe2020a-zu_he_shu_wen_ti-tj