Supongamos que se está llevando a cabo el siguiente algoritmo. Hay una gran variedad v 1 , v 2 , ... , v n v1, v2, ..., vn llenan con ceros en el arranque. La siguiente operación se aplica a la matriz en varias ocasiones - en i i-ésimo paso ( 0 0 -indexed) se puede:
- o bien elegir la posición p o s POS ( 1 ≤ p o s ≤ n 1≤pos≤n) y aumento v p o s vpos por k i ki;
- o no elegir cualquier posición y omitir este paso.
Usted puede elegir cómo el algoritmo se comportaría en cada paso y cuándo detenerlo. La pregunta es: ¿se puede hacer arsenal v v igual a la matriz dada una un ( v j = un j vj = aj para cada j j) después de un paso?
La primera línea contiene un entero T T ( 1 ≤ T ≤ 1000 1≤T≤1000) - el número de casos de prueba. Siguiente 2 T líneas 2T contienen casos de prueba - dos líneas por cada caso de prueba.
La primera línea de cada caso de prueba contiene dos enteros n n y k k ( 1 ≤ n ≤ 30 1≤n≤30, 2 ≤ k ≤ 100 2≤k≤100) - el tamaño de las matrices v v y un una y el valor k k utilizado en el algoritmo.
La segunda línea contiene n n enteros un 1 , un 2 , ... , un n a1, a2, ..., an ( 0 ≤ una i ≤ 10 16 0≤ai≤1016) - la matriz desea lograr.
Para cada caso de prueba de impresión Sí (mayúsculas o minúsculas) si se puede lograr la matriz una una después de algún paso o no (sensible a mayúsculas) en caso contrario.
5 4 100 0 0 0 0 1 2 1 3 4 1 4 1 3 2 0 1 3 3 9 0 59049 810
SI SI NO NO SÍ
en el sentido de que una secuencia diana dada, y pregunta si el funcionamiento prosigue a través de varios pasos a partir de la secuencia de la secuencia diana (todos ceros). Para la i-ésima operación, por lo tanto dejan de fumar pueden ser acoplados a la i-ésima potencia de un número k.
Teniendo en cuenta lo que no puede hacer, y cada aumento en el número de diferentes unos de otros, puede pensar: cada intento de dividir la potencia del número de secuencia diana en una pluralidad de k (diferentes entre sí), y la forma de (similar a la resolución binaria) como [i] = k ^ p1 + p2 + k ^ k ^ .... pn (p1! = p2! = ... pn), si no se resuelve satisfactoriamente, entonces puede ser juzgado no directamente alcanzar. Luego, para cada número al que p1 ... pn Ordenar en un vector y, a continuación, si hay dos números son iguales entre sí lata no llegar (el número de cada operación aplicada no es el mismo), de lo contrario.
Para más detalles, véanse las notas.
#include <bits / STDC ++ h.> usando espacio de nombres std; int n, k; largo largo ori [ 35 ], a [ 35 ]; int main () { int t; cin >> t; mientras que (t-- ) { cin >> n >> k; memset (a, 0 , sizeof (a)); int i; vector < int > v; para (i = 1 ; i <= n; i ++ ) { scanf ( " % LLD " , y ori [i]); } bool bandera = 1 ; para (i = 1 ; i <= n; i ++ ) { De largo a largo TEMP = ori [I]; int CNT = 0 ; SI (ori [I] == 0 ) // 0 ninguna acción { Continuar ; } el tiempo (TEMP) // resuelto { IF (TEMP% k! = 0 && (TEMP- . 1 )% k! = 0 ) // representantes del poder y no se puede dividir en la forma de k { bandera = 0 ; romper ; } IF ((TEMP- . 1 )% k == 0 ) // hay un 0 º k { v.push_back (cnt); // la variable actual acumulado arrojado a temp--; // reste 1 cnt ++ ; temp / = k; } más si (temp% k == 0 ) { cnt ++ ; temp / = k; } } si (bandera!) descanso ; } SI (la bandera!) // hay que determinar primero la { cout << " NO " << endl; continuar ; } SI (! V.size ()) // caso en el que la bandera no es 0 si el vector vacío { cout << " SÍ " << endl; continuar ; } sort (v.begin (), V.END ()); para (i = 0 ; i <v.size () - 1 ; i ++ ) { IF (V [I] == V [I + . 1 ]) // frase repitió { bandera = 0 ; romper ; } } si (! bandera) { cout << " NO " << endl; continuar ; } otro tribunal << " SÍ " << endl; } volver 0 ; }