洛谷1313 计算系数

来源:互联网 发布:网络不谢是什么意思 编辑:程序博客网 时间:2024/05/04 03:28

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;}


0 0