Editorial for K-Perfección
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Observación 1: La paridad del número de divisores de un número depende de si es un cuadrado perfecto o no. Si es un cuadrado perfecto, entonces tiene un número impar de divisores; de lo contrario, tiene un número par de divisores.
Subtarea 1
En esta subtarea se cumple que . Cuando existe una sola permutación y esta cumple la condición de perfección. Cuando notar que como todos los elementos de la secuencia son iguales solo hace falta chequear que los dos primeros elementos cumplan la condición de perfección, si cumplen la condición entonces la respuesta es porque cualquier permutación de los índices que se pueda hacer es una permutación válida, de lo contrario la respuesta sería .
Complejidad:
Subtarea 2
En esta subtarea se cumple . Para esta subtarea era suficiente iterar por todas las permutaciones de los índices y verificar si los consecutivos cumplían la condición de perfección.
Complejidad:
vector<ll> p(n); iota(p.begin(), p.end(), 0);
int res = 0;
do {
bool ok = true;
for (int i = 0; i < n - 1; i++) {
if (!kPerfect(a[p[i]] * a[p[i + 1]], k)) {
ok = false; break;
}
}
res = (res + ok) % MOD;
} while (next_permutation(p.begin(), p.end()));
Subtarea 3
En esta subtarea se cumple que . Cuando existe una sola permutación y esta cumple la condición de perfección. Cuando todos los elementos son iguales sería resolver la subtarea 1. De lo contrario, si hay al menos dos elementos distintos, podemos factorizar en primos cada uno de los números y quedarnos solo con los primos que tengan una potencia impar para cada una de las posiciones. Por ejemplo, si , y el nuevo arreglo . Si la cantidad de elementos distintos que hay en este arreglo es distinto de entonces la solución es , de lo contrario es .
Complejidad:
Subtarea 4
En esta subtarea se cumple que . Cuando procedemos a resolver la subtarea 3. Veamos para . La idea para resolver esta subtarea es utilizar dp con máscara de bits.
Sea la cantidad de formas de reorganizar el subconjunto al que representa siendo el número de la posición el último número de la secuencia. Entonces la respuesta es .
Los casos bases son cuando representa solamente a un número, donde es el la posición del número representado por , es decir, para todo se cumple que . A partir de estos casos bases es fácil notar que para todo que cumpla sea perfecto.
Complejidad:
Subtarea 5
Si procedemos a resolver la subtarea 3. Veamos la solución para , la primera idea es "comprimir" el arreglo en otro arreglo donde todos los elementos no "semejantes" queden en una misma posición.
Si tiene un número par de divisores, entonces no es un cuadrado perfecto, por lo que el problema se reduce a contar la cantidad de formas de reorganizar el arreglo para que () no sea un cuadrado perfecto. Tenga en cuenta que si y son cuadrados perfectos, entonces también es un cuadrado perfecto (transitivo). También tenemos que es un cuadrado perfecto para cada (reflexivo), y si es un cuadrado perfecto, entonces también es un cuadrado perfecto (simétrico). Podemos concluir que la relación de cuadrado perfecto es una relación de equivalencia (en adelante referida como ). Se sabe que existe una partición única . Dada la partición , el problema se reduce a reorganizar de tal manera que dos elementos consecutivos no estén en la misma clase de equivalencia de la partición . El nuevo problema se puede resolver utilizando programación dinámica en .
Considere un nuevo arreglo donde los elementos en la misma partición tienen el mismo valor. Agrupamos todos los valores distintos en el arreglo.
Entonces el problema se reduce a contar la cantidad de formas de reorganizar el nuevo arreglo de tal forma que dos elementos consecutivos sean diferentes. Este nuevo problema puede ser resuelto utilizando programación dinámica:
Sea la cantidad de arreglos distintos que se pueden obtener utilizando los elementos de los primeros grupos de manera que haya exactamente pares de posiciones consecutivas con el mismo valor. La respuesta se puede encontrar en .
Ahora supongamos que la suma de las frecuencias de los primeros valores es . Esto significa que los arreglos que podemos construir utilizando los elementos de estos grupos tienen tamaño , por lo que podemos insertar los elementos del grupo en espacios: antes del primer número, después del último y entre cualquier par de elementos consecutivos. Podemos fijar el número de espacios donde queremos insertar al menos un número del grupo , pero también necesitamos fijar el número de estos espacios que estarán entre elementos que previamente tenían el mismo valor. El estado actualizará el estado .
La cantidad de formas de elegir espacios de manera que exactamente estén entre elementos consecutivos que tienen el mismo valor se puede calcular fácilmente utilizando fórmulas de combinaciones. Nos queda encontrar la cantidad de formas de insertar elementos en espacios. Este también es un problema clásico con una respuesta simple: .
Complejidad:
Comments