Primero sacamos el número más pequeño aa en la secuenciaa , supongamos que ahora hay uno mayor queaaun módulobbb , luego piense en el efecto de su orden en la respuesta.
Para cualquier entero positivo xxx , necesitamos satisfacerx% a% b = x% b% ax \% a \% b = x \% b \% ax % a % b=x % b % a , y porqueb> a b> asegundo>a, 所以x% a% b = x% ax \% a \% b = x \% ax % a % b=x % a , entonces la fórmula anterior esx ≡ x% b (moda) x \ equiv x \% b \ pmod aX≡x % b( m o da )
Entonces establezca x = tb + yx = tb + yX=t b+y,那么 t b + y ≡ y ( m o d a ) tb+y\equiv y \pmod a t b+y≡y( m o da ) debido attt es arbitrario, por lo que solo cuandoa ∣ ba | bCuando a ∣ b , la ecuación siempre se cumple.
Entonces comprenda que esta conclusión también se puede extender a toda la secuencia, por lo que llegamos a la conclusión: cada número en la secuencia es un múltiplo del número más pequeño.
Luego, solo tenemos que enumerar el número más pequeño de 1, averiguar cuántos múltiplos hay en el rango y luego seleccionar k-1 del número de combinaciones (el número más pequeño está determinado por sí mismo).
#include <bits/stdc++.h>
#define ll long long
#define MAX 1000005
#define P 998244353
using namespace std;
ll n, k;
ll fac[MAX], inv[MAX];
void init(int n){
fac[0] = 1, inv[0] = inv[1] = 1;
for(int i = 1; i <= n; i++) fac[i] = fac[i-1]*i%P;
for(int i = 2; i <= n; i++) inv[i] = (P-P/i)*inv[P%i]%P;
for(int i = 2; i <= n; i++) inv[i] = inv[i]*inv[i-1]%P;
}
ll C(ll n, ll m){
if(!m) return 1;
return fac[n]*inv[m]%P*inv[n-m]%P;
}
int main()
{
init(MAX-1);
cin >> n >> k;
ll ans = 0;
for(int i = 1; i <= n; i++){
if(n/i < k) break;
ans = (ans+C(n/i-1, k-1))%P;
}
cout << ans << endl;
return 0;
}