思路:
DP做法,但考试时死活没想到如何来模拟这样的多项式
f[i][j] 表示 xi yj 的系数,所以你可以发现,k并没有用,因为给了你要求的 xn ym ,一直往后推出到答案就好啦
样例解释:1 1 3 1 2
f[0][1]=0
f[0][0]=1
f[0][2]=0
f[0][1]=1
f[1][0]=0
f[0][0]=1
f[1][1]=0
f[0][1]=1
f[1][1]=1
f[1][0]=1
f[1][2]=0
f[0][2]=1
f[1][2]=1
f[1][1]=2
因为后面的状态全靠之前的状态推出,完全符合 DP 的思想
代码
#include<stdio.h> const int MX=10001,P=10007; long long f[MX][MX]; int a,b,k,n,m; int main() { scanf("%d%d%d%d%d",&a,&b,&k,&n,&m); f[0][0]=1; for(int i=0;i<=n;++i) { for(int j=0;j<=m;++j) { if(i>0) f[i][j]=(f[i][j]+f[i-1][j]*a)%P; if(j>0) f[i][j]=(f[i][j]+f[i][j-1]*b)%P; } } printf("%lld",f[n][m]); return 0; }
updated:2018-10-25
现在才发现这是道裸的二项式定理,k其实是有用的,因为 x的次方加上 y的次方 = k
这就告诉你了这在杨辉三角的哪一行,预处理推出,加上快速幂求 an*bm
相乘就是答案啦~
code
#include<stdio.h> #include<algorithm> using namespace std; const int mxn=1010,P=10007; long long a,b,k,n,m; long long c[mxn][mxn]; long long ksm(long x,long d) { long long re=1; while(d) { if(d&1) re=re*x%P; x=x*x%P; d>>=1; } return re; } int ycl() { c[1][1]=1; for(int i=0;i<=1000;++i) c[i][0]=1; for(int i=2;i<=1000;++i) { for(int j=1;j<=i;++j) { c[i][j]=(c[i-1][j]+c[i-1][j-1])%P; } } } int main() { ycl(); scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m); a%=P,b%=P; long long ans=ksm(a,n)*ksm(b,m)*c[k][n]%P; printf("%lld",ans); return 0; }