高速パワー(C ++)

クイックパワー:

説明:aのb乗を見つけて、余りmを取ります

通常は次のように記述されます。intans= 0、ans = ans * a%mを開き、合計b回実行します。

for(int i=0;i<b;i++)
{
    
    
	ans = ans * a % m;
}
cout << ans;

「明らかに、時間は十分ではありません。」

クイックパワー思考:二分法の考え方に基づいて、bが奇数の場合:aからbのパワー= a aからb-1のパワー、
bが偶数の場合、aからbのパワー= aからb / 2乗* a b / 2の累乗。
:2の10乗= 2の5乗* 2の5乗
5 =
2 2の4
...
2の0が1に等しくなるまで、戻ります。

ll binaryPow(ll a, ll b, ll m)
{
    
    
	if (b == 0)  return 1;		//如果0次幂 ,返回1
	if (b % 2 == 1) return a * binaryPow(a, b - 1, m) % m;	//幂是偶数情况
	else {
    
    
		ll temp = binaryPow(a, b / 2, m);			//否则是奇数情况
		return temp * temp % m;						
	}
}

完全なコード:

#include<algorithm>
#include <iostream>
#include<string.h>
using namespace std;
typedef long long ll;

ll binaryPow(ll a, ll b, ll m)
{
    
    
	if (b == 0)  return 1;
	if (b % 2 == 1) return a * binaryPow(a, b - 1, m) % m;
	else {
    
    
		ll temp = binaryPow(a, b / 2, m);
		return temp * temp % m;
	}
}

int main()
{
    
    
	//求a的b次幂取余m
	ll a, b, m;
	cin >> a >> b >> m;
	cout << binaryPow(a, b, m);
	return 0;
}

あとがき:おやすみなさい

おすすめ

転載: blog.csdn.net/Kyrie_irving_kun/article/details/114904120