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;
}
posted @ 2022-07-07 19:08  Bellala  阅读(37)  评论(0)    收藏  举报