[SDOI2016 disposición count]

Título original:

 

 n, m <= 1E6, probar una pluralidad de conjuntos de datos, el número de grupo de datos <= 5E5

 

Dado que una está dispuesto, así que si ai = i así que deja que no se mueven

M se selecciona entre el movimiento individual, los restantes reorganizado, que cada uno puede en su posición, el número de programas buscan

Esto no es lo Ordenar dislocación

Sobre la dislocación Hace especie escribió explicar, si la secuencia se encuentra ahora a escuchar también a la simple recursiva

Para que f (n) de longitud n, el número de programas ordenó interrupción secuencia

Para recursiva de f (n-1) a f (n), independientemente de la longitud n 1-uno de esquema

Método a: desde seleccionado en un número n-1, con n el número de la central, es fácil demostrar que tales una

Método 2: Si el número de n-1 en un número exactamente en su posición, este número a continuación, el intercambio y el número n de programas puede ser legalmente

Si el número n-1 hay un número de no más de su propia posición, no puede ser válida en este momento el programa es fácil de demostrar

Por lo tanto, un método de Método II + se puede obtener sin omisión no se repetirá número n de la serie de programas

Muy fácil de llegar f (n) = (n-1) * f (n-1) + (n-1) * f (n-2) = (n-1) * [f (n-1) + f ( n-2)]

Entonces responder a esta pregunta es f (nm) * c (n, m)

La pregunta ahora es encontrar el número de combinaciones, ya que un gran número de conjuntos de datos, por lo que no puede encontrar el número de combinaciones de la violencia

Y n y m son grandes, el número de combinaciones puede encontrar recursiva

¿Cómo romper?

Algunos estudiantes dicen, Lucas

Lucas es probable que sea posible, pero hay una manera más fácil

Esa es la pre-factorial directamente dentro 1E5, el número de combinaciones será capaz de encontrar el método de la fórmula

nota:

Número tipo programa de desalineación 0 a 1

En este problema el rendimiento, es decir, cuando n = m, y exactamente f (0) * c (n, m) = 1 ésimo programa de

Si esta frase Bute no puede llegar a un punto

 

código:

1 #include <iostream>
 2 #include <cstdio>
 3  usando  espacio de nombres std;
4  #define LL largo largo
 5  const  int mo = 1000000007 ;
6  int n, m;
7 LL f [ 1100000 ];
8 LL j [ 1100000 ];
9  qcp LL (LL x, LL y) {
 10      LL bwl = 1 , z = x;
11      para (; y; y >> = 1 ) {
 12          si (y & 1 ) bwl = bwl * z% mo;
13         z = z * z% mo;
14      }
 15      de retorno bwl;
16  }
 17  int main () {
 18      f [ 0 ] = 1 , f [ 1 ] = 0 , f [ 2 ] = 1 ;
19      // 注意f [0] 
20      para ( int i = 3 ; i <= 1.000.000 ; ++ i) f [i] = (i- 1 ) * (f [i- 1 ] + f [i- 2 ] )% mo;
21      j [ 0 ] = 1 ;
22     para ( int i = 1 ; i <= 1.000.000 ; ++ i) j [i] = j [i- 1 ] *% i mo;
23      int T; cin >> T;
24      , mientras que (T -> 0 ) {
 25          scanf ( " % d% d " , y n, y m);
26          printf ( " % LLD \ n " , f [nm] * j [n]% de Mo * qcp (j [m], mo- 2 )% de Mo * qcp (j [nm], mo- 2 )% mo) ;
27      }
 28      de retorno  0 ;
29 }
Ver código

 

Supongo que te gusta

Origin www.cnblogs.com/cdcq/p/12658008.html
Recomendado
Clasificación