1137 计算系数
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
给定一个多项式(ax + by)^k,请求出多项式展开后x^n y^m项的系数。
输入描述 Input Description
共一行,包含 5 个整数,分别为a,b,k,n,m,每两个整数之间用一个空格隔开。
输出描述 Output Description
输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。
样例输入 Sample Input
1 1 3 1 2
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
数据范围
对于 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。
************************1.关键借前50%了解杨辉三角形(应先了解 二项式定理求系数的通项公式 和 杨辉三角 的一些小知识便很容易)
************************2.设(ax+by)^k
************************* 二项式定理有求系数的通项公式 T(n+1) = c (r)
c * (ax)^(k-r) * (by)^r ;
c (k)
************************************************************************************************88
即所求系数为(把后提前) c (r)
(a)^(k-r) * (b)^r * c -> x^(k-r) * y^r(即要求的x^n y^m项的系数)
c (k)
**************************巨大C可用永辉三角很快求出
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
long long tra[1010];
int a,b,k,n,m,i,j;
cin>>a>>b>>k>>n>>m;
memset(tra,0,sizeof(tra));
tra[1] = 1; //杨辉三角形,需要 加的时候 取余
for(i = 1; i <= k; i++)
for(j = i+1; j >= 1; j--)
tra[j] = (tra[j-1] + tra[j])%10007;
// printf("%llu\n",tra[m+1]);
//求b^m && a^n
long long A = 1 , B = 1;
for(i = 1; i <= n; i++)
A = (A*a)%10007;
for(i = 1; i <= m; i++)
B = (B*b)%10007;
A = (A*B)%10007;
A = (A*tra[m+1]%10007);
cout<<A<<endl;
/* 以下使用牛顿法求tra[m+1]
// cout<<A<<" "<<B<<endl;
//求C(k -> m) 即 (k!)/(m!*(k-m)!) 即 杨辉所求 tra[m+1] , 最后结果只需要 * 其中一个就可以了
long long M = 1,KM = 1,K = 1;
for(i = 1; i <= m; i++)
M = (M*i)%10007;
for(i = 1; i <= k-m; i++)
KM = (KM*i)%10007;
for(i = 1; i <= k; i++)
K = (K*i)%10007;
//求系数
long long sum = A;
sum = (sum*B)%10007;
M = (M*KM)%10007;
K = K/M;
sum = (sum*K)%10007;
cout<<sum<<endl;
*/
return 0;
}
/*
yh-rt1.c - 时间和空间最优算法
#include <stdio.h>
#include <stdlib.h>
int main()
{
int s = 1, h; // 数值和高度
int i, j; // 循环计数
scanf("%d", &h); // 输入层数
printf("1\n"); // 输出第一个 1
for (i = 2; i <= h; s = 1, i++) // 行数 i 从 2 到层高
{
printf("1 "); // 第一个 1
for (j = 1; j <= i - 2; j++) // 列位置 j 绕过第一个直接开始循环
//printf("%d ", (s = (i - j) / j * s));
printf("%d ", (s = (i - j) * s / j));
printf("1\n"); // 最后一个 1,换行
}
getchar(); // 暂停等待
return 0;
}
*/
******************************************************************仅供吐槽
1137 计算系数
最新推荐文章于 2022-01-06 15:58:18 发布