排列组合优化
正常的排列组合需要n^2的复杂度
但是我们可以使用约数和定理将其优化
视频讲解
const int mod = 1e9 + 7;
const int N = 2010;
int primes[N], cnt;
int num[N];
bool st[N];
void get_primes(int n) {//素数筛
for (int i = 2; i <= n; i++) {
if (!st[i]) {
primes[cnt++] = i;
for (int j = 2 * i; j <= n; j += i)
st[j] = true;
}
}
}
int get(int n, int p) {//n的阶乘里面有几个p
int ans = 0;
while (n) {
ans += n / p;
n /= p;
}
return ans;
}
ll Pow(ll x, ll n) {//x的n次方
ll ans = 1;
while (n) {
if (n & 1) ans = ans * x%mod;
x = x * x%mod;
n = n >> 1;
}
return ans;
}
ll C(int n, int s) {//排列组合
get_primes(n);//如果需要多次调用C函数,只需要执行一次素数筛
for (int i = 0; i < cnt; i++) {
int p = primes[i];
num[i] = get(n, p) - get(s, p) - get(n - s, p);
}
ll ans = 1;
for (int i = 0; i < cnt; i++)
ans = ans * Pow(primes[i], num[i]) % mod;
return ans;
}