P1226 [Plantilla] Exponenciación rápida || operación de resto (Luogu)

Portal de título original

Inserte la descripción de la imagen aquí
Idea: Hay dos enfoques para esta pregunta: recursividad e iteración. Lo que uso aquí es el método iterativo. Primero, defina una variable entera larga y asigne un valor. Luego, determine si el extremo binario del exponente es 1, si 1 es un número impar, acumule a, luego eleve al cuadrado la base b, y luego dividir el exponente p. El binario se desplaza 1 bit hacia la derecha y este proceso se repite hasta que p <= 0.

Referencia de código

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
    
    
	ll b,p,k,ans;
	cin>>b>>p>>k;
	ans=1;
	cout<<b<<"^"<<p<<" mod "<<k<<"=";
	while(p > 0){
    
    
		if(p & 1)//b的二进制末尾为1,即奇数
			ans = ans * b % k;
		b = b * b % k;
		p >>= 1;//将b的二进制向右移1位数
	}
	cout<<ans%k;
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Bertil/article/details/106794925
Recomendado
Clasificación