P1226 [テンプレート]高速べき乗||剰余演算(Luogu)

オリジナルタイトルポータル

ここに画像の説明を挿入
アイデア:この質問には、再帰と反復の2つのアプローチがあります。ここで使用するのは反復法です。まず、長整数変数を定義して値を割り当てます。次に、指数の2進数が1であるかどうかを判断し、1が奇数の場合、aを累積し、底bを2乗します。次に、指数pを除算します。バイナリは1ビット右にシフトされ、このプロセスがp <= 0になるまで繰り返されます。

コードリファレンス

#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;
}

おすすめ

転載: blog.csdn.net/Bertil/article/details/106794925