CF938E Max Historia (Matemática combinatoria)

La idea original de este tema, primero ordenamos la secuencia, y encontramos que la contribución de cada número es en realidad encontrar el número más pequeño que él y registrarlo como cnt

Luego enumere la posición de este número, luego puede seleccionar j-1 de cnt para completar el frente, y luego necesita organizar

Pero esto excede la complejidad, por lo que consideramos optimizar esta combinación de expresión numérica, la primera es una reducción simple

Después de la cita, encontramos que la resta del número entre los dos factores arriba y abajo es una constante. Si este es el caso, podemos multiplicar el factorial de esta constante afuera y luego dividirlo por la suma. Puede convertir la suma en un número combinado

Según el cambio del triángulo Yang Hui, puede convertirse en una respuesta que se puede calcular directamente

#include <iostream> 
#include <algorithm> 
#include <cstring> 
#include <cstdio> 
#include <map> 
#include < string > 
#include <vector>
 usando el  espacio de nombres std; 
typedef largo  largo ll;
const  int N = 1e6 + 10 ;
const ll mod = 1e9 + 7 ; 
ll a [N]; 
ll qmi (ll a, ll b, ll mod) { 
    ll res = 1 ;
    while (b) {
         if (b & 1 )
        res
    }= (res * a)% mod; 
        a = a * a% mod; 
        b >> = 1 ; 
    } 
    return res% mod; 
} 
int main () { 
    ll n; 
    cin >> n; 
    ll tot = 1 ;
    int i;
    para (i = 1 ; i <= n; i ++ ) 
        tot = tot * i% mod;
    para (i = 1 ; i <= n; i ++ ) { 
        scanf ( " % lld " , & a [i]); 
    ordenar (a +1 , a + 1 + n); 
    ll ans = 0 ;
    int j;
    para (i = 1 ; i <= n; i = j) {
         para (j = i; a [j] == a [i]; j ++ );
        if (j <= n) 
            ans = (ans + tot * qmi (n-i + 1 , mod- 2 , mod)% mod * (ji)% mod * a [i])% mod; 
    } 
    cout << ans << endl;
    devuelve  0 ; 
}
Ver código

 

Supongo que te gusta

Origin www.cnblogs.com/ctyakwf/p/12727592.html
Recomendado
Clasificación