【题 解】 CF1359E 【Estabilidad modular】

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 aXx % 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+yy( 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_30115697/article/details/109486329
Recomendado
Clasificación