Operación de 01 bit (exponenciación rápida)? ?

Operación de bits

20190702 ~

1. Conceptos básicos

  1. Elemento de lista 1. Los datos en la computadora (positivos y negativos) se almacenan en formato binario
  2. Cuatro operaciones:
与 		x & y
或 		x | y
非		| x
异或		x ^ y
  1. El tipo int es de 32 bits, donde el primer bit es el bit de signo.
    Los números negativos están representados por el complemento de uno-n = n reverso +1
  2. Operador de cambio >>: tenga en cuenta que todos los cambios en la computadora son aritméticos, por lo que cuando se desplaza hacia la derecha, debe complementar el bit de signo
  3. Cuando se inicializa una matriz, generalmente se inicializa a infinito positivo
memset(f, 0x3f, sizeof f);	//将f中的每一个字节都初始化为输入的数 所以最后为0x3f3f3f3f

En programación dinámica o teoría de grafos, a menudo se usan dos números para
sumar, es decir: 0x3f3f3f3f * 2 <0xffffffff, no se producirá desbordamiento

Dos, operación XOR

(1) Cónyuge realizador mediante OR exclusivo

  1. Si la matriz se almacena en pares, puede obtener rápidamente otro número en la matriz mediante XOR
  2. El flujo de costo mínimo de la teoría de grafos utilizará esta idea
  3. En la tabla adjunta de simulación de matriz, se conservarán los bordes de avance y retroceso de los bordes. Una vez que los bordes de avance y retroceso se almacenan juntos, se puede lograr una evaluación rápida durante el cálculo.

(2 y 3 aún no se han expuesto, y aún no puedo entender completamente el significado. Volveré para agregar después de conocer el contenido relevante más adelante)

(Dos) operación de bit bajo

  1. Función Lowbit: encuentra el 1 más bajo de un número binario
// E.G.  lowbit(1001011000) = 1000

  n   =  1001011000
 ~n   =  0110100111
 ~n+1 =  0110101000
 -n   =  ~n+1

//代码实现为:
int lowbit(int n)
{
	return (~n+1) & n;
或	return (-n) & n;
}

Tres, ejemplo x3

(1) Encuentre el valor de a módulo p elevado a la potencia b

Punto de conocimiento:
problema de potencia rápida .
También introduce potencia rápida de matriz (ahora no hay requisitos)

Tema:
Formato de entrada: tres enteros a, b, p separados por espacios en la misma línea
Formato de salida: da salida a un entero, que representa el valor de a ^ b mod p
Rango de datos: 1 <= a, b, p <= 10 9

Muestra de entrada: 3 2 7
Muestra de salida: 2

  1. Simplifica los tiempos de cálculo de a b por el binario de b

3 7 es equivalente a multiplicar 7 3s, por lo que si lo hace directamente, debe multiplicar 6 veces. En este momento, la desventaja no es obvia, pero cuando la potencia b es muy grande, la cantidad de cálculo es demasiado grande, lo que hará que el tiempo de cálculo se extienda. Sin embargo, considerando la idea binaria, el número de veces se puede simplificar mediante la relación múltiple entre potencias adyacentes.
7 = 111

3 1 = 3
3 2 = 9
3 4 = 81
Esto convierte 6 operaciones en una multiplicación de tres números

De manera similar, 2 13 es encontrar la potencia correspondiente a través del número binario de 13 y dividir 13 en 1 + 4 + 8

2 1101 1 1 0 1
b cada bit del correspondiente a n 1 * 3 8 1 * 3 4 0 * 3 2 1 * 3 1
  1. (a b ) mod p = (m n ) mod p
    若 m = (a mod p) n = (b mod p)
#include <iostream>;
using namespace std;

int main(){
   int a,b,p;          	   //C++中输入变量的值--直接使用cin输入即可
   cin >> a >> b >> p ;
   int res = 1 % p;        //先假设一个结果:新变量res(求a^b的本质是乘法 所以设res=1 ;若求a*b 其本质为加法 设res=0)
                           //%p:如果b为0 直接没有进入循环
                           //或int res = 1; 在最后输出的时候 cout << res % p
   while(b){           	   //首先考虑变量b的个位
       if(b&1) res = res * 1ll * a % p;          //b&1:判断b的个位是否为1 
                                                 /*因为a b p 的数字比较大 可能会发生溢出 
                                                   所以要改变数据类型至long long 1ll是long long类型的整数1 
                                                   通过*1ll实现数据类型的强制转换*/
                                                 //现在已经处理完个位了
       a = a * 1ll * a % p;    //在第二次循环的时候 操作b的十位 将b的十位不断平方
       b >>= 1;       //b右移1位 去掉个位
   }
   cout << res << endl;
   return 0;
}

(2) Encuentre el valor de a multiplicado por b módulo p

Formato de entrada: la primera línea del entero a, la segunda línea del entero b y la tercera línea del entero p.
Formato de salida
: muestra un entero, que representa el valor de a * b mod p. Rango de datos: 1≤a, b, p≤1018
entrada Muestra:
3
4
5
Muestra de salida:
2

El principio es el mismo que el del ejemplo uno.

#include <iostream>
using namespace std;
typedef unsigned long long ULL;        //如何判断什么时候使用无符号数?
                                       //注意使用替换的关键字是typedef 并且最后需要加分号

int main(){
    ULL a, b, p;
    cin >> a >> b >> p;
    ULL res = 0;   
    while(b){
        if(b & 1) res = (res + a) % p;
        b >>= 1;                        //注意 >>= 中间是不能加空格的
        a = a * 2 % p;
    }
    
    cout << res << endl;
    return 0;
}

(3) El camino Hanilton más corto

Dado un gráfico no dirigido ponderado con n puntos, los puntos están etiquetados de 0 a n-1, encuentre la ruta de Hamilton más corta desde el punto inicial 0 hasta el punto final n-1. El camino de Hamilton se define como pasar por cada punto exactamente una vez de 0 a n-1.

Formato de entrada: ingrese el entero n en la primera línea yn números enteros en
cada línea en las siguientes n líneas, donde el j-ésimo entero en la i-ésima línea representa la distancia desde el punto i al j (denotado como a [i, j]).
Para cualquier x, y, z, los datos garantizan a [x, x] = 0, a [x, y] = a [y, x] y a [x, y] + a [y, z]> = a [x, z]

Formato de salida: genera un número entero, que representa la longitud de la ruta de Hamilton más corta.

Rango de datos
1≤n≤20 0≤a
[i, j] ≤107
Ejemplo de entrada:
5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0
Ejemplo de salida :
18


Supongo que te gusta

Origin blog.csdn.net/weixin_45349512/article/details/94563762
Recomendado
Clasificación