WELCOME

任何一个伟大的目标,都有一个微不足道的开始。

【一本通提高组合数学】 计算系数(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;
}

posted @ 2022-07-12 20:35  绿树公司  阅读(61)  评论(0)    收藏  举报