クイックパワー:
説明: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;
}