P1313 计算系数
题目描述
给定一个多项式 (by+ax)^k(by+ax)k ,请求出多项式展开后 x^n \times 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\n",ans*dp[k][m]%MOD); return 0; }