题链
组合数结合下降幂的应用(我觉得组合数和下降幂真配)
见本
时间复杂度\(O(m^2)\)
注意预处理第二类斯特林数,写错了2次
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1005;
int n,x,p,m,a[N],s[N][N],b[N];
inline int mo(int x) {
return x>=p?x-p:x;
}
inline int ksm(ll a,int b) {
ll ret=1;
while(b) {
if(b&1) ret=ret*a%p;
a=a*a%p,b>>=1;
}
return ret;
}
int main() {
scanf("%d%d%d%d",&n,&x,&p,&m);
for(int i=0;i<=m;i++) scanf("%d",&a[i]);
s[0][0]=1;
for(int j=1;j<=m;j++) {
s[j][j]=1;
for(int i=j+1;i<=m;i++) {
s[i][j]=((ll)s[i-1][j-1]+(ll)j*s[i-1][j])%p;
}
}
for(int j=0;j<=m;j++) {
for(int i=j;i<=m;i++) {
b[j]=((ll)a[i]*s[i][j]+b[j])%p;
}
}
int ans=(ll)b[0]*ksm(1+x,n)%p,h=1;
for(int i=1;i<=m;i++) {
h=(ll)h*(n-i+1)%p;
ans=((ll)b[i]*h%p*ksm(x,i)%p*ksm(1+x,n-i)+ans)%p;
}
printf("%d\n",ans);
return 0;
}