CF1359E Modular Stability 题解

· · 题解

注意到,x\bmod p_1 \bmod p_2\bmod \cdots \bmod p_n 无论怎么变换 p 的顺序结果不变,那么 p_1 为最小值,所有 p_i 一定是某个正整数 d 的倍数。于是只需要预处理一下逆元,并枚举 d 用组合数求结果即可。

代码:

#include <bits/stdc++.h>

using namespace std;

const int M = 1e6 + 5, mod = 998244353;

long long jc[M], jcinv[M], ans;
int n, k;

int C(int n, int m)
{
    return jc[n] * jcinv[m] % mod * jcinv[n - m] % mod;
}

long long ksm(long long a, int b)
{
    long long c = 1;
    while (b)
    {
        if (b & 1) c = c * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return c;
}

int main()
{
    jc[0] = 1;
    jcinv[0] = 1;
    for (int i = 1; i <= M - 5; i ++ )
    {
        jc[i] = jc[i - 1] * i % mod;
        jcinv[i] = ksm(jc[i], mod - 2);
    }
    cin >> n >> k;
    for (int i = 1; i <= n; i ++ )
    {
        if (n / i < k) break;
        ans = (ans + C(n / i - 1, k - 1)) % mod;
    }
    cout << ans << endl;
    return 0;
}