abc227 G - Divisors of Binomial Coefficient
题意:
求 \(C_n^k\) 的不同因子数
\(n\le 1e12, k\le \min \{1e6,n\}\)
思路:
\[C_n^k=\frac{(n-k+1)\cdots n}{1*2*\cdots *k}
\]
主要是别满脑子
\(n!\) 中 \(p\) 的指数是 \(\lfloor n/p\rfloor+\lfloor n/p^2\rfloor+\cdots\)
这题分母很大,需要记录并处理除剩的数即 \(>1e6\) 的大质因子,所以要老老实实一个一个除
复杂度跟调和级数有关
void sol() {
ll n, k, ans = 1; cin >> n >> k;
auto pri = get_primes(1e6); //筛质数
vector<ll> mu(k+1); iota(all(mu), n-k); //n-k+1*...*n
vector<int> zi(k+1); iota(all(zi), 0); //1*2*...*k
for(int p : pri) {
int c = 0; //p的指数
//分母,从>=n-k+1的第一个p的倍数开始
for(ll i = cei(n-k+1,p)*p; i <= n; i += p)
while(mu[i-(n-k)] % p == 0) mu[i-(n-k)] /= p, c++;
//分子
for(int i = p; i <= k; i += p)
while(zi[i] % p == 0) zi[i] /= p, c--;
ans = mul(ans, c + 1);
}
//分母中的大质数
for(int i = 1; i <= k; i++)
if(mu[i] > 1) ans = mul(ans, 2);
cout << ans;
}

浙公网安备 33010602011771号