E. Modular Stability. (数学同余式)

题目链接:https://codeforces.com/contest/1359/problem/E

题目大意:

给你 n 和 k,构造一个长度为 k 的数组,然后数组中的每个元素  1 <= a[i] <= n ,任何一个 (x % a[1]) % a[2]... 取模的顺序可以随意调换,但是结果并没有改变的这样的 a 的数组的个数

想法:

#pragma GCC optimize(2)
#pragma GCC optimize(3)

#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <ctime>
#include <bitset>
#include <cmath>
#include <sstream>
#include <iostream>

#define ll long long
#define ls nod<<1
#define rs (nod<<1)+1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define INF 0x3f3f3f3f3f3f3f3f
#define max(a, b) (a>b?a:b)
#define min(a, b) (a<b?a:b)


const double eps = 1e-10;
const int maxn = 5e5 + 10;
const int MOD = 998244353;

int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }

using namespace std;

ll da[maxn];//G++ long long
void init()
{
    int i;
    da[0]=1;
    da[1]=1;
    for(i=2;i<maxn;i++)
        da[i]=i*da[i-1]%MOD;
}
ll quickmod(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1)
        {
            ans=(ans*a)%MOD;
            b--;
        }
        b/=2;
        a=((a%MOD)*(a%MOD))%MOD;
    }
    return ans;
}
ll C(ll a, ll b)
{
    return (da[a]%MOD)*(quickmod(da[b]*da[a-b]%MOD,MOD-2))%MOD;
}

int main() {
    ios::sync_with_stdio(false);
    init();
    ll n,k;
    cin >> n >> k;
    ll ans = 0;
    for (int i = 1;i <= n;i++) {
        if (n / i < k)
            continue;
        ans = (ans + C(n/i-1,k-1)) % MOD;
    }
    cout << ans << endl;
    return 0;
}
 
原文地址:https://www.cnblogs.com/-Ackerman/p/13188886.html