1. 程式人生 > 實用技巧 >兩種資料消費方式:pull與push

兩種資料消費方式:pull與push

板子題一

P1641 [SCOI2010]生成字串

#define int long long
int jc[maxn], ny[maxn], jcny[maxn];
int C(int n, int m) {
	return 1ll * jc[n] * jcny[n - m] % mod * jcny[m] % mod;
}
int lucas(int n, int m) {
	if(m == 0) return 1;
	return C(n % mod, m % mod) * lucas(n / mod, m / mod) % mod;
}
signed main() {
	int n = read(), m = read()
	jc[1] = ny[1] = jcny[1] = 1;
	for (int i = 2; i <= maxn; i++) jc[i] = jc[i - 1] * i % mod;
	for (int i = 2; i <= maxn; i++) ny[i] = (mod - mod / i) * ny[mod % i] % mod;
	for (int i = 2; i <= maxn; i++) jcny[i] = (jcny[i - 1] * ny[i]) % mod;
	cout << (lucas(n + m, m) - lucas(n + m, m - 1) + mod)  % mod << endl;
}

板子題二

#10238. 「一本通 6.6 練習 9」網格
恩,高精,python水過

n, m = map(int, input().split())
def C(n, m):
    return jc[n]//jc[n - m]//jc[m]
jc = [1]
for i in range(1, m + n + 1):
    jc.append(jc[i - 1] * i)
print(C(n + m, n) - C(n + m, n + 1))

卡卡記憶體和時間

jc = [1]
jc1 = jc2 = jc3 = last = 1
n, m = map(int, input().split())
for i in range(1, m + n + 1):
	cur = last * i
	last = cur
	if i == n + m: jc1 = cur
	if i == n: jc2 = cur
	if i == m: jc3 = cur
	if i == n + 1: jc4 = cur
	if i == m - 1: jc5 = cur
print((jc1//jc2//jc3 - jc1//jc4//jc5))