Introducir:
Para una disposición de 1 ~ n, si queremos guardarlo como un estado, generalmente abriremos una matriz n-dimensional de tamaño n ^ n, pero en este caso, la complejidad del espacio a menudo explotará, pero el 1 ~ n El acuerdo es solo hasta n! Es mucho más pequeño que n ^ n, así que considere usar un número para representar una disposición y comprimir el espacio. La expansión de Cantor corresponde a una permutación a su número ordinal en toda la permutación, es decir, la permutación de esta permutación de pequeña a grande en todas las permutaciones. (Por supuesto, se puede organizar de mayor a menor)
¿Cómo encontrar una variedad de Cantor?
Hay una fórmula: R ^ A n- K = A . 1 ( n- - . 1 ) ! + A 2 ( n- - 2 ) ! + ⋯ + A n- 0 , donde el rango de corriente está dispuesto x1, x2, ..., xn de! El valor de expansión de Cantor, ai, está detrás de xi, es decir , el número de números menores que xi en x i + 1 ~ x n .
(Explicar cavar)
1 int cantor ( int x [], int n) 2 { // expansión de cantor, n significa disposición completa de n bits, x [] significa número totalmente organizado (representado por la matriz) 3 int ans = 0 , sum = 0 ; 4 para ( int i = 1 ; i <n; i ++ ) { 5 para ( int j = i + 1 ; j <= n; j ++ ) 6 if (x [j] < x [i]) 7 sum ++; // Registre cuántos 8 ans + = suma * factorial [ni]; // el factorial acumulativo es el valor factorial preprocesado que es menor que xi 9 sum = 0 ; // El contador se restablece a 10 } 11 return ans + 1 ; // +1 se debe a que el número ordinal se cuenta solo. Si desea saber cuántas permutaciones hay delante, no necesita agregar 12 }
Preguntas de ejemplo:
Luogu P1379 Ocho Rompecabezas digital
Uso típico del estado de compresión de expansión de Cantor
Expansión: expansión inversa de Cantor (excavación)