题目描述
求 (ax+by)^k 的展开中 x^n*y^m 项的系数。由于系数可能很大,只要求输出除以 10007 的余数。
输入
一行共五个整数,分别为 a,b,k,n,m
输出
一个整数,为该项系数除以10007的余数。
样例输入
1 1 3 1 2
样例输出
3
数据范围:
30% 0<=k<=10,
50% a=1,b=1
100% 0<=k<=1000, 0<=n,m<=k 且 n+m=k, 0<=a,b<=100,000
//NOIP2011 DAY2 factor
Solution:
首先先不考虑a,b的变化,即假设a=b=1。
然后开始分析题意,(ax+by)^k的展开,在数学上是一个杨辉三角~
//下面是数学问题惹
(假定a=b=1) 我们就k=0,1,2,3...进行分析
1 x^0*y^0
1 1 x^1+y^1
1 2 1 x^2+2xy+y^2
1 3 3 1 x^3+3x^2y+3xy^2+*y^2
...... ......
以此类推,本题只是增加了a,b的数值。
在杨辉三角中找出ans=f[k][m]后,再把ans^a后再ans^b即可。
记得取模(不用写快速幂也是很良心der~)
1 #include<cstdio> 2 #define MAXN 1005 3 #define MODE 10007 4 using namespace std; 5 int f[MAXN][MAXN]; 6 int a,b,k,n,m,ans=1; 7 int main(){ 8 scanf("%d%d%d%d%d",&a,&b,&k,&n,&m); 9 a%=MODE;b%=MODE; 10 for(int i=1;i<=k;i++) { 11 f[i][i]=f[i][0]=1; 12 f[i][1]=i; 13 } 14 for(int i=3;i<=k;i++) 15 for(int j=2;j<=i;j++) f[i][j]=(f[i-1][j-1]+f[i-1][j])%MODE; 16 ans=f[k][m]%MODE; 17 for(int i=1;i<=n;i++) ans=(ans*a)%MODE; 18 for(int i=1;i<=m;i++) ans=(ans*b)%MODE; 19 printf("%d",ans); 20 return 0; 21 }
时间: 2024-12-08 22:44:57