#include<stdio.h>
#define N 10007
#define M 1000
int f(int n,int m,long long int a, long long int b)
{
static int dp[M][M]={1},i,j;
for (i=0;i<=n;i++)
for (j=0;j<=m;j++)
if (i+j)
if (i==0)
dp[i][j] = b*dp[i][j-1]%N;
else if (j==0)
dp[i][j] = a*dp[i-1][j]%N;
else
dp[i][j] = (a*dp[i-1][j]+b*dp[i][j-1])%N;
return dp[n][m];
}
int main()
{
int T;
scanf("%d",&T);
for(int i=0;i<T;i++)
{
long long int a,b;
int k,n,m;
scanf("%lld %lld %d %d %d",&a,&b,&k,&n,&m);
int ans=f(n,m,a,b);
printf("case #%d:\n",i);
printf("%d",ans);
if(i!=T-1) printf("\n");
}
return 0;
}
直接展开的话x^n*y^m的系数为超出范围,因此使用递推的方法,x^n*y^m的系数若为d(n,m),则d(n,m)=a*d(n-1,m)+b*d(n,m-1),再根据题目要求进行取模操作(不涉及负数所以直接取余数)。f函数最后会得到不同次幂对应的系数形成的静态数组,返回我们想要的那一个。