https://www.luogu.org/problem/show?pid=1313
系数应该是a^n*b^m*c(n,m),主要是求c(n,m)
c(n,m)=n!/m!*(n-m)!
法1:
分解质因子
#include<cstdio>
#include<iostream>
int su[20000],yz[20000];
int n,m,k,a,b;
int p=10007;
void fen1(int q)
{
int x=2;
while(q>1)
{
while(q%x==0)
{
yz[x]++;
q/=x;
}
x++;
}
}
void fen2(int q)
{
int x=2,j=0;
while(q>1)
{
while(q%x==0)
{
yz[x]--;
q/=x;
}
x++;
}
}
int main()
{
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
a=a%p;
b=b%p;
int ans=1;
for(int i=1;i<=n;i++)
ans=(ans*a)%p;
for(int i=1;i<=m;i++)
ans=(ans*b)%p;
for(int i=2;i<=k;i++)
fen1(i);
for(int i=2;i<=n;i++)
fen2(i);
for(int i=2;i<=k-n;i++)
fen2(i);
for(int i=2;i<=k;i++)
if(yz[i]>0)
for(int j=1;j<=yz[i];j++)//!!
{
ans=(ans*i)%p;
}
printf("%d",ans);
return 0;
}
法2:
杨辉三角
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<string>
#include<map>
#define LL long long
#define mod 10007
using namespace std;
int a,b,k,n,m,ans;
int yh[1001][1001];
int fastpow(int a,int p)
{
int b=1;
while(p>1)
{
if(p%2==1)
b=(b*a)%mod;
a=(a*a)%mod;
p/=2;
}
return (a*b)%mod;
}
int main()
{
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
a%=mod;b%=mod;//!!
for(int i=0;i<=k;i++)
{
yh[i][0]=1;
yh[i][i]=1;
}
for(int i=1;i<=k;i++)
{
for(int j=1;j<=i;j++)
{
yh[i][j]=(yh[i-1][j-1]+yh[i-1][j])%mod;
}
}
ans=(((fastpow(a,n)*fastpow(b,m))%mod)*yh[k][n])%mod;
printf("%d",ans);
return 0;
}