【問題描述】
由二項式定理可知(x+y)^n=C(n,1)*x^1*y^n+C(n,2)*x^2*y^(n-1)+…+C(1,n)*x^n*y+x^k+y^k。(其中x,y爲實數,C(x,y)代表從有x個元素的集合中選擇含有y個元素的組合的組合數。)
將上式中x,y換成ax,by,得到x^ny^m的係數是a^nb^m*C(k,n)。
C(k,n)可以用遞推得到(當然也可以寫數學公式,只是不好取模)。
設d[i][j]爲C(i,j) d[i][j]=d[i-1][j-1]選+d[i-1][j]不選.
a^n,b^m直接二分快速冪就行了。(也可以暴力)
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define mo 10007
using namespace std;
typedef long long LL;
int a,b,k,n,m;
int d[1005][1005];
LL getckn(int k,int n)
{
memset(d,0,sizeof(d));
for(int i=0;i<=k;i++)
d[i][0]=1;
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
d[i][j]=(d[i-1][j]%mo+d[i-1][j-1]%mo)%mo;
/*for(int i=1;i<=k;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",d[i][j]);
printf("\n");
}*/
return d[k][n];
}
LL qkpw(int a,int b)
{
LL ans=1,t=a;
while(b>0)
{
if(b&1)ans=ans*t%mo;
t=t*t%mo;
b=b>>1;
}
return ans;
}
int main()
{
//freopen("my.in","r",stdin);
//freopen("my.out","w",stdout);
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
LL a1=getckn(k,n);
LL a2=qkpw(a,n);
LL a3=qkpw(b,m);
LL ans=((a1%mo*a2%mo)*(a3%mo))%mo;
cout<<ans<<endl;
return 0;
}