voidget_primes(int n) { for (int i = 2; i <= n; i ++ ) { if (!st[i]) primes[cnt ++ ] = i; for (int j = 0; primes[j] <= n / i; j ++ ) { st[primes[j] * i] = true; if (i % primes[j] == 0) break; } } }
intget(int n, int p) { int res = 0; while (n) { res += n / p; n /= p; } return res; }
vector<int> mul(vector<int> a, int b) { vector<int> c; int t = 0; for (int i = 0; i < a.size(); i ++ ) { t += a[i] * b; c.push_back(t % 10); t /= 10; } while (t) { c.push_back(t % 10); t /= 10; } return c; }
intmain() { int a, b; cin >> a >> b;
get_primes(a);
for (int i = 0; i < cnt; i ++ ) { int p = primes[i]; sum[i] = get(a, p) - get(a - b, p) - get(b, p); }
vector<int> res; res.push_back(1);
for (int i = 0; i < cnt; i ++ ) for (int j = 0; j < sum[i]; j ++ ) res = mul(res, primes[i]);
for (int i = res.size() - 1; i >= 0; i -- ) printf("%d", res[i]); puts("");
return0; }
下次拿python覆写一遍。
番外の数——卡特兰数
作为卡特兰数,这个世界上很多方案数都是卡特兰数,拥有和斐波那契数一样的地位
表达形式:
f(n)=f(0)×f(n−1)+f(1)×f(n−2)+…+f(n−1)×f(0)
f(n)=C(2n, n) - C(2n , n - 1)
f(n)=C(2n, n) / (n + 1)
卡特兰数的初始化:f(0) = 1
例题展示
给定 n 个 0 和 n 个 1,它们将按照某种顺序排成长度为 2n 的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。
输出的答案对 10^9+7 取模。
输入格式
共一行,包含整数 n。
输出格式
共一行,包含一个整数,表示答案。
数据范围
1≤n≤10^5
输入样例:
3
输出样例:
5
代码实现:
#include<iostream>
usingnamespace std;
typedeflonglong LL;
constint MOD = 1e9 + 7;
intqkm(int a, int k, int p) { int res = 1;
while(k) { if(k & 1) res = (LL)res * a % p; a = (LL)a * a % p; k >>= 1; }
return res; }
intmain() { int n; cin >> n;
int a = n * 2; int b = n;
int f = 1;
for(int i = a; i > b; i -- ) f = (LL)f * i % MOD;
for(int i = 1; i <= n; i ++ ) f = (LL)f * qkm(i, MOD - 2, MOD) % MOD;