题目描述
给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m 项的系数。
输入格式:
共一行,包含5 个整数,分别为 a ,b ,k ,n ,m,每两个整数之间用一个空格隔开。
输出格式:
输出共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。
输入样例:
1 1 3 1 2
输出样例:
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。
思路:
ans为C(m+n,n) * a^n * b^m
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 typedef long long ll; 6 const int MOD=10007; 7 ll a,b,k,n,m; 8 ll powMod(ll a,ll b){ 9 a%=MOD;b%=MOD; 10 ll ans=1; 11 for(;b;b>>=1,a=(a*a)%MOD) 12 if(1&b) ans=(ans*a)%MOD; 13 return ans; 14 } 15 ll C(ll n,ll k){ 16 ll s1=1,s2=1; 17 if(k>n-k) k=n-k; 18 for(int i=1;i<=k;i++){ 19 s1=s1*(n-i+1)%MOD; 20 s2=s2*i%MOD; 21 } 22 return s1*powMod(s2,MOD-2)%MOD; //in 23 } 24 int main(){ 25 scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m); 26 printf("%lld",C(m+n,m)*powMod(a,n)*powMod(b,m)%MOD); 27 28 }
看到形如(x + y)n的形式的题,马上想到杨辉三角。由杨辉三角,可以很轻易地得到xnym前面的常数。
同时,我们也可以知道a,b的指数是和x,y是一样的,又因为k很大,不难想到快速幂的算法至于快速幂。
1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 using namespace std; 5 long long s[1010][1010]; 6 int a,b,k,n,m; 7 long long ans; 8 long long fast_pow(int x,int y,int mod) {//快速幂 9 long long base=x,t=1;//注意!!10006*10006可能会爆int 10 for (;y;base=base*base%mod,y>>=1) 11 if (y&1) t=t*base%mod; 12 return t; 13 } 14 int main() { 15 scanf("%d%d%d%d%d",&a,&b,&k,&n,&m); 16 s[1][1]=1;//计算杨辉三角 17 for (int i = 2;i <= k+1;i++) { 18 for (int j = 1;j <= i;j++) { 19 s[i][j]=(s[i-1][j]+s[i-1][j-1])%10007; 20 } 21 } 22 ans=(s[k+1][k-n+1]*fast_pow(a,n,10007)*fast_pow(b,m,10007))%10007; 23 printf("%lld",ans); 24 return 0; 25 }
-