Cómo resolver el problema SPOJ XORROUND

Primero, imagine que cada elemento de entrada es solo un bit (0 o 1). Luego, la operación de redondeo XOR es equivalente a tomar la matriz como un vector de bits y multiplicarla por una matriz donde la primera fila es 11000 … 001 y cada fila subsiguiente se obtiene girando a la derecha un bit. Por ejemplo, para [matemáticas] N = 6 [/ matemáticas], la matriz es:

110001
111000
011100
001110
000111
100011

Para aplicar las rondas XOR [math] K [/ math], podemos elevar esta matriz a la potencia de [math] K [/ math] y luego multiplicarla por el vector de entrada para obtener el resultado final.

Aunque [math] K [/ math] es grande, podemos usar el algoritmo de cuadrado y multiplicación para realizar la exponenciación usando solo [math] O (\ log K) [/ math] multiplicaciones de matriz individuales. Sin embargo, una sola matriz de multiplicación seguirá siendo lenta cuando [matemática] N = 500 [/ matemática]. Para acelerarlo, solo tenga en cuenta que cada vez que realizamos una multiplicación matricial, solo necesitamos calcular la primera fila del resultado; todas las demás filas se pueden completar simplemente girando hacia la derecha. Esto permite que la potencia [matemática] K [/ matemática] de la matriz se calcule solo en [matemática] O (N ^ 2 \ log K) [/ matemática] tiempo en lugar de [matemática] O (N ^ 3 \ log K) [/ math] time.

Resolver el problema para números de varios bits es fácil. Se toma la matriz final y, en lugar de multiplicarla por la matriz de entrada, es decir, al usar cada fila como plantilla para los bits que se deben agregar en el vector de la columna de entrada, se usa cada fila como plantilla para qué elementos XOR en el vector de columna de entrada.

Mantenga 2 matrices, elemento de cálculo en una nueva matriz de 3 elementos de una antigua, cambie las matrices al final del ciclo. Los puntos de bonificación para determinar que la matriz se convierte en valores iguales o, más generalmente, se transfiere a un conjunto limitado de matrices.

More Interesting

Cómo encontrar el factorial de un número grande, como 100, en C

¿Cuáles son algunos algoritmos utilizados por las grandes empresas (como Amazon) para determinar de manera eficiente desde qué almacén se debe cumplir un pedido?

Cómo fusionar tres matrices ordenadas en una sola matriz ordenada de manera eficiente

¿Cuál es el mejor algoritmo de procesamiento de imágenes para comparar una pintura recibida como entrada contra la base de datos y seleccionar la coincidencia más cercana?

¿Cuáles son los requisitos previos para Introducción a los algoritmos de Thomas Cormen?

¿Por qué un árbol se llama estructura de datos?

¿Es posible tener análisis predictivos utilizando motores de recomendación? En caso afirmativo, ¿cuáles son algunos de los algoritmos de análisis predictivo utilizados por los motores de recomendación?

¿Por qué sigo fallando la introducción a los algoritmos en la escuela de posgrado?

¿Deben las clases de algoritmos incluir tareas de programación?

Crear un algoritmo simple me lleva horas, ¿cómo puedo ser más rápido?

Dada una matriz con 100 elementos (números del 0 al 99), si saco un elemento aleatorio, ¿cómo encontrarías el que saqué? ¿Cómo resolvería esto si 1: la matriz está ordenada o 2: la matriz no está ordenada?

Cómo saber el orden de magnitud de un algoritmo

¿Qué es un buen libro sobre estructuras de datos y algoritmos en javascript?

¿Cómo son útiles las estructuras de datos?

¿Cómo funciona el algoritmo de Google Maps?