解 1 费马小定理
#include<iostream>
using namespace std;
long long a,b,k,m,n;
const int p=10007;
long long fact(long long x,long long y)
{
long long ans=1;
long long t=x;
while(y)
{
if(y&1)
ans=ans*t%p;
t=t*t%p;
y=y>>1;
}
return ans;
}
int main()
{
cin>>a>>b>>k>>n>>m;
long long las=1;
long long s=k;
for(long long i=n;i>=1;i--)
{
// cout<<s<<” “<<i<<endl;
las=las*(s--)%p;
las=las*fact(i,p-2)%p;
}
// cout<<las<<endl;
// cout<<fact(a,n)%p<<endl;
// cout<<fact(b,k-n)%p<<endl;
cout<< (las*fact(a,n)%p)*fact(b,k-n)%p;
return 0;
}
解二:杨辉三角dp
C(n,m)=C(n-1,m)+C(n-1,m-1)
#include<iostream>
using namespace std;
#define ll long long
ll f[1005][1005];
long long a,b,k,m,n;
const int p=10007;
long long fact(long long x,long long y)
{
long long ans=1;
long long t=x;
while(y)
{
if(y&1)
ans=ans*t%p;
t=t*t%p;
y=y>>1;
}
return ans;
}
int main()
{
for(int i=0;i<1005;i++)
f[i][i]=1;
for(int i=0;i<1005;i++)
{
f[i][0]=1;
}
for(int i=2;i<1005;i++)
for(int j=1;j<i;j++)
{
f[i][j]=(f[i-1][j]+f[i-1][j-1])%p;
}
cin>>a>>b>>k>>n>>m;
long long las=1;
long long s=k;
for(long long i=n;i>=1;i--)
{
las=las*(s--)%p;
las=las*fact(i,p-2)%p;
}
cout<< (f[k][n]*fact(a,n)%p)*fact(b,k-n)%p;
return 0;
}