分析一波发现如果一个序列合法,那么必须满足所有数都是最小值的倍数.
加上组合数就行了.
code:
#include <bits/stdc++.h> #define ll long long #define mod 998244353 #define N 500006 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int fac[N],inv[N]; int qpow(int x,int y) { int tmp=1; for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod; return tmp; } int INV(int x) { return qpow(x,mod-2); } void init() { fac[0]=inv[0]=1; for(int i=1;i<N;++i) fac[i]=(ll)fac[i-1]*i%mod,inv[i]=INV(fac[i]); } int C(int x,int y) { return (x<y||x<0||y<0)?0:(ll)fac[x]*inv[y]%mod*inv[x-y]%mod; } int main() { // setIO("input"); int n,k; init(); scanf("%d%d",&n,&k); int ans=0; for(int i=1;i<=n;++i) { (ans+=(ll)C(n/i-1,k-1)%mod)%=mod; } printf("%d ",ans); return 0; }