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 ; }