题目描述
给定一个多项式 (by+ax)^k(by+ax)k ,请求出多项式展开后 x^n imes y^mxn×ym 项的系数。
输入输出格式
输入格式:
共一行,包含 55 个整数,分别为 a ,b ,k ,n ,ma,b,k,n,m ,每两个整数之间用一个空格隔开。
输出格式:
共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 1000710007 取模后的结果。
输入输出样例
说明
【数据范围】
对于 30\%30% 的数据,有 0 ≤k ≤100≤k≤10 ;
对于 50\%50% 的数据,有 a = 1,b = 1a=1,b=1 ;
对于 100\%100% 的数据,有 0≤k ≤1,000,0≤n, m≤k0≤k≤1,000,0≤n,m≤k ,且 n+m=k ,0 ≤a,b ≤1,000,000n+m=k,0≤a,b≤1,000,000 。
noip2011提高组day2第1题
题解:
其实x^n,y^m,就是这个a*x 被选中n次,快速幂写一下a^n,b^m; 还有就是要在*C(k,m)=C(k-1,m)+C(k-1,m-1) 递推式求解;我个人理解就是被选中的方法数。
#include <bits/stdc++.h>
const int MOD=10007;
using namespace std;
#define LL long long
LL pow_mod(LL a, LL b, LL p){//a的b次方求余p
LL ret = 1;
while(b){
if(b & 1) ret = (ret * a) % p;
a = (a * a) % p;
b >>= 1;
}
return ret;
}
LL Fermat(LL a, LL p){//费马求a关于b的逆元
return pow_mod(a, p-2, p);
}
LL kuai(LL x,LL k)
{
LL ans=1;
while(k)
{
if(x&1) ans=(ans*x)%MOD;
k>>=1;
x*=x;
x%=MOD;
}
return ans;
}
int dp[1001][1000];
int main()
{
int a,b,k,n,m;
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
LL ans=1;
ans=(ans*pow_mod(a,n,MOD))%MOD;
ans=(ans*pow_mod(b,m,MOD))%MOD;
for (int i = 0; i <=k ; ++i) {
dp[i][0]=1;
}
dp[1][0]=1;dp[1][1]=1;
for (int i = 2; i <=k ; ++i) {
for (int j = 1; j <=i ; ++j) {
dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%MOD;
}
}
printf("%lld
",ans*dp[k][m]%MOD);
return 0;
}