题目
描述
给定一个多项式 ( b y + a x ) k (by+ax)^k (by+ax)k ,请求出多项式展开后 x n × y m x^n \times y^m xn×ym 项的系数。
输入格式
- 输入共一行,包含 5 5 5 个整数,分别为 a , b , k , n , m a,b,k,n,m a,b,k,n,m,每两个整数之间用一个空格隔开。
输出格式
输出共一行,包含一个整数,表示所求的系数。
这个系数可能很大,输出对
10007
10007
10007 取模后的结果。
输入/输出例子
输入
1 1 3 1 2
输出
3
提示
【数据范围】
对于
30
%
30\%
30% 的数据,有
0
≤
k
≤
10
0\le k\le 10
0≤k≤10。
对于
50
%
50\%
50% 的数据,有
a
=
1
,
b
=
1
a=1,b=1
a=1,b=1。
对于
100
%
100\%
100% 的数据,有
0
≤
k
≤
1000
0\le k\le 1000
0≤k≤1000,
0
≤
n
,
m
≤
k
0\le n,m\le k
0≤n,m≤k,
n
+
m
=
k
n+m=k
n+m=k,
0
≤
a
,
b
≤
1
0
6
0\le a,b\le 10^6
0≤a,b≤106。
解题思路
思路
这题方法很多,这里用数学方法。
分析
二项式定理:
所以有:
那么对于
x
n
×
y
m
x^n \times y^m
xn×ym 项的系数,我们就可以得出其
=
a
n
×
b
m
×
C
k
m
=a^n \times b^m \times C_{k}^m
=an×bm×Ckm。
对于前面两个东西,我们用快速幂解决,对于后面的东西,我们用杨辉三角解决。
code
#include<bits/stdc++.h>
#define int long long
#define mod 10007
using namespace std;
int a,b,n,m,k,x,y,z,C[2500][2500];
int qmi(int p,int q)
{
int ans=1,o=p;
while(q>0)
{
if(q&1)
ans*=o;
o*=o;
o%=mod;
ans%=mod;
q>>=1;
}
return ans;
}
signed main()
{
scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m);
for(int i=1;i<=k;i++)
{
C[i][1]=i;
for(int j=2;j<=m;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1],C[i][j]%=mod;
}
int x=qmi(a,n),y=qmi(b,m),z=C[k][m];
x=x*y%mod;
x=x*z%mod;
x%=mod;
printf("%lld",x);
}