标签:ack include res isp pre efi scan black int
首先常规地把\(f(k)\)拆开:
然后证明一个组合恒等式:
\(\square\) 考虑它的组合意义:有\(n\)个不同的盒子,每个盒子可以染成\(x\)种不同的颜色,也可以不染。将\(i\)个不同的球放入这些盒子中有颜色的盒子里,不同的方案个数。
考虑从两个方面计数:
因为这两种是对同一个组合问题的计数,于是\(LHS=RHS\)。\(\blacksquare\)
那么原式就变成了:
把该预处理的预处理一下就能做到\(O(m^2)\)了。
代码:
#include<cstdio>
#define N 1005
int n,x,P,m,a[N];
int s[N][N];
inline int fpow(int y,int k){
int res=1;
for(;k;k>>=1,y=1ll*y*y%P)
if(k&1)
res=1ll*res*y%P;
return res;
}
int tmp[N];
int ans;
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 i=1;i<=m;i++)
for(int j=1;j<=i;j++)
s[i][j]=(s[i-1][j-1]+1ll*j*s[i-1][j]%P)%P;
for(int i=0;i<=m;i++){
tmp[i]=fpow(x+1,n-i);
for(int j=i-1;j>=0;j--)
tmp[j]=1ll*tmp[j+1]*(x+1)%P;
for(int j=0,t1=1,t2=1;j<=i;j++,t1=1ll*t1*(n-j+1)%P,t2=1ll*t2*x%P)
ans=(ans+1ll*a[i]*s[i][j]%P*t1%P*t2%P*tmp[j]%P)%P;
}
printf("%d",ans);
#define w 0
return ~~(‘0‘)?(0^w^0):(0*w*0);
}
标签:ack include res isp pre efi scan black int
原文地址:https://www.cnblogs.com/Y25t/p/13192578.html