luogu1313 计算系数

题目大意:给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m 项的系数。

将原式化为(ax+by)*(ax+by)*...①,然后将其拆解,拆解时x乘了多少次,a就乘了多少次,y,b同理。故设所求为t*a^n*b^m。因为拆解时相当于在①括号各个括号内提取出n个x,在剩余的括号内提取出y,不同的组合方式对应一个展开后的项a^n*b^m*x^n*y^(k-M),所以t等于C(k, a)。

怎么求组合数呢?利用C(r, r)=1, C(n, 0)=1, C(n, r)=C(n-1,r-1)+C(n-1,r)(n>r)进行递推即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define ll long long
const ll P = 10007, MAX_K = 1010;

ll Mult(ll a, ll b)
{
	ll ans = 0;
	while (b)
	{
		if (b & 1)
			ans = (ans + a) % P;
		a = (a + a) % P;
		b >>= 1;
	}
	return ans;
}

ll Power(ll a, ll n)
{
	ll ans = 1;
	while (n)
	{
		if (n & 1)
			ans = Mult(ans, a);
		a = Mult(a, a);
		n >>= 1;
	}
	return ans;
}

int Comb(int r, int n)
{
	static ll C[MAX_K];
	memset(C, 0, sizeof(C));
	C[0] = 1;
	for (int i = 1; i <= n; i++)
	{
		for (int j = min(r, i); j >= 0; j--)
		{
			if (i == j)
				C[j] = 1;
			else
				C[j] = (C[j - 1] + C[j]) % P;
		}
	}
	return C[r];
}

int main()
{
	ll a, b, k, n, m;
	scanf("%lld%lld%lld%lld%lld", &a, &b, &k, &n, &m);
	printf("%lld\n", Mult(Comb(n, k), Mult(Power(a, n), Power(b, m))));
	return 0;
}

  

转载于:https://www.cnblogs.com/headboy2002/p/8847756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值