Codeforces educativa Ronda 83 (Clasificado para Div. 2) Adición C. Powers (数学)

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?

Entrada

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.

Salida

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.

Ejemplo
Entrada
Copiar
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
Salida
Copiar
SI
SI
NO
NO
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 << " " << 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 << " " << endl;
    }
    
    
    volver  0 ;
}

 

Supongo que te gusta

Origin www.cnblogs.com/lipoicyclic/p/12453200.html
Recomendado
Clasificación