2017 上海ECfinal A题,组合数学

题意:

T组样例,给定N, K,求 ( C(N, K) + C(N, K + 1) + C(N, K + 2) + ... + C(N, N)  ) mod 1e9 + 7。

T <= 100, N <= 1e9, K <= 1e5。

思路:

原问题可以转化为 2^N -  C(N, 0) - C(N, 1) - C(N, 2) - ... - C(N, K - 1)。

2^N 可以快速幂求解,后面的部分用阶乘+逆元线性递推一下就可以了。

签到。。。

代码实现:

#include 
#include 
#include 
#include 

using namespace std;

typedef long long LL;

const int N = 100010, mod = 1e9 + 7;

int qmi (int a, int b) {
	int res = 1;
	while (b) {
		if (b & 1) res = (LL) a * res % mod;
		a = (LL) a * a % mod;
		b >>= 1;
	}
	return res;
}

int sol (int a, int b) {
	int ans = 1, tmp = 1;
	for (int i = 1, j = a; i <= b; i ++ , j -- ) {
		tmp = (LL) tmp * j % mod;
		tmp = (LL) tmp * qmi(i, mod - 2) % mod;
		ans = ((LL) ans + tmp) % mod;
	}
	return ans;
}

int main () {
	int t, cas = 0;
	cin >> t;
	while (t -- ) {
		int n, k;
		cin >> n >> k;
		printf("Case #%d: ", ++ cas);
		cout << (((LL)qmi(2, n) - sol(n, k - 1)) % mod + mod) % mod << endl;
	}
	return 0;
}

THE END;

你可能感兴趣的:(区域赛,数学)