NOIP2011 Day2 T1
题目描述
给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数。
输入输出格式
输入格式:
输入文件名为factor.in。
共一行,包含5 个整数,分别为 a ,b ,k ,n ,m,每两个整数之间用一个空格隔开。
输出格式:
输出共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。
输入输出样例
输入样例#1:
11 3 1 2
输出样例#1:
3
说明
【数据范围】
对于30% 的数据,有 0 ≤k ≤10 ;
对于50% 的数据,有 a = 1,b =1;
对于100%的数据,有 0 ≤k ≤1,000,0≤n, m ≤k ,且n + m = k ,0 ≤a ,b ≤1,000,000。
noip2011提高组day2第1题
对于学过二项式定理的高二高三党来说,这就是一道送分题。。。如果能顺利地打出大组合数取模和快速幂的话。
二项式定理:
Tk+1表示(a+b)n展开式的第k+1项,其通式为Tk+1=C(n,k)akb(n-k)。然后就可以解决了。直接跑组合数(本蒟蒻用逆元写的,老实说卢卡斯定理不怎么会用,用不好了有可能超时),再跑两个快速幂就出来了,唯一比较坑的地方就是要打好多好多次取模,一不留神就可能出错,所以要细心。
参考代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int jc[1005];
const int mod=10007;
long long power(int x,int y)
{
longlong re=1,a=x;
inti=y;
for(;i;i=i>>1,a=a*a%mod)
if(i&1) re=re*a%mod;
returnre;
}
long long C(int n,int m)
{
if(m==0) return 1;
if(n==m) return 1;
return((jc[n]*power(jc[m],mod-2))%mod*power(jc[n-m],mod-2))%mod;
}
int main()
{
inta,b,k,n,m;
cin>>a>>b>>k>>n>>m;
longlong p1,p2,p3,p;
jc[1]=1;
for(int i=2;i<=k;i++)
jc[i]=(jc[i-1]*i)%mod;
p1=C(k,min(n,m));
p2=power(a,n);
p3=power(b,m);
p=(p1%mod*p2%mod)%mod*p3%mod;
cout<<p<<endl;
return0;
}