其他分享
首页 > 其他分享> > 【一本通提高组合数学】 计算系数(NOIP2011提高组)

【一本通提高组合数学】 计算系数(NOIP2011提高组)

作者:互联网

题面

思路

根据二项式定理,

(a+b)^n=\sum_{k=0}^nC_{n}^{k}a^kb^{n-k}

那么

(ax+by)^k=\sum_{p=0}^kC_{k}^p(ax)^p(by)^{k-p}=\sum_{p=0}^k(C_{k}^pa^pb^{k-p})x^py^{k-p}

算 a^n,b^m 需要用快速幂.

C_n^m=C_{n-1}^m+C_{n-1}^{m-1}

C_n^m=\frac{n!\bmod{10007}}{m!(n-m)!\bmod{10007}}=n!\times [m!(n-m)!]^{-1}\bmod{10007}

其中 [m!(n-m)!]^{-1} 为逆元, 这个可以直接用费马小定理, 正好前面写了快速幂, 岂不是美滋滋.

Code

#include <bits/stdc++.h>
using namespace std;
long long mod = 10007;
int a, b, k, n, m;
long long ans = 0;

long long ksm(long long a, long long b)
{
	long long sum = 1;
	a %= mod;
	while (b)
	{
		if (b & 1)
			sum = sum * a % mod;
		a = a * a % mod;
		b = b >> 1;
	}
	return sum;
}

int main()
{
	cin >> a >> b >> k >> n >> m;
	ans = ksm(a, n) * ksm(b, m) % mod;
	for (int i = 1, j = k; i <= n; i++, j--)
	{
		ans = ans * j % mod;
		ans = ans * ksm(i, mod - 2) % mod;
	}
	cout << ans << endl;
	return 0;
}

标签:系数,NOIP2011,int,sum,long,ans,ksm,提高,mod
来源: https://blog.csdn.net/hello_wangping/article/details/122768515