首先想到如果将mod的顺序变化了一下,如果答案肯定不变,那么所有数必须要是最小的数的倍数。并且题目已知数列递增。
这是因为如果模数没有倍数关系,这就会破坏模的数据,可以通过在纸上举例子得出
因此本题答案只跟最小的数有关,枚举最小的数,之后就是在倍数中取k-1个,根据逆元组合数预处理得解
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=6e5+10; const int mod=998244353; int n,k; ll infact[N]; ll fact[N]; ll qmi(ll a,ll b){ ll res=1; while(b){ if(b&1){ res=res*a%mod; } a=a*a%mod; b>>=1; } return res; } void init(){ int i; fact[1]=fact[0]=1; for(i=2;i<=n;i++){ fact[i]=fact[i-1]*i%mod; } infact[1]=1; infact[0]=1; for(i=2;i<=n;i++){ infact[i]=infact[i-1]*qmi(i,mod-2)%mod; } } int main(){ cin>>n>>k; init(); int i; ll res=0; for(i=1;i<=n;i++){ if(n/i-1<k-1) break; res=(res+(ll)fact[n/i-1]*infact[k-1]%mod*infact[n/i-k]%mod)%mod; } cout<<res<<endl; }