1137 计算系数

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;
}
*/
******************************************************************仅供吐槽
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值