题目链接: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; }