P1313 计算系数
题目描述
给定一个多项式((by+ax)^k),请求出多项式展开后(x^n*y^m)项的系数。
输入输出格式
输入格式:
共一行,包含5个整数,分别为(a,b,k,n,m),每两个整数之间用一个空格隔开。
输出格式:
共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。
思路:
由二项式定理得,结果为(C_k^m*a^n*b^m mod 10007)
因为10007是质数,所以我们可以用费马小定理求出阶乘逆元再直接求出(C_k^m),(a,b)则线性乘过去即可。
Code:
#include <cstdio>
#define ll long long
const ll mod=10007;
ll inv[2],a,b,k,n,m,ans=1,fac=1;
ll quick_pow(ll d,ll t)
{
ll f=1;
while(t)
{
if(t&1)
f=f*d%mod;
d=d*d%mod;
t>>=1;
}
return f;
}
void init()
{
scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m);
inv[0]=inv[1]=1;
for(int i=1;i<=n;i++)
{
inv[0]=inv[0]*i%mod;
ans=ans*a%mod;
}
for(int i=1;i<=m;i++)
{
inv[1]=inv[1]*i%mod;
ans=ans*b%mod;
}
for(int i=1;i<=k;i++)
fac=fac*i%mod;
inv[0]=quick_pow(inv[0],mod-2);
inv[1]=quick_pow(inv[1],mod-2);
}
void work()
{
ans=ans*fac%mod*inv[0]*inv[1]%mod;
printf("%lld
",ans);
}
int main()
{
init();
work();
return 0;
}
2018.7.4