推荐阅读原文:
https://www.cnblogs.com/sun-of-Ice/p/9330352.html
https://blog.csdn.net/liangllhahaha/article/details/82119378
以下内容有补充删改
关于快速幂的介绍见原文,下面直接看代码。
经典的代码。求a的n次方
#include <bits/stdc++.h>
using namespace std;
// 求a^n a的n次方
typedef long long ll;
ll qpow( ll a, ll n )
{
ll re = 1;
while ( n ) {
if ( n&1 ) { // 判断n的最后一位是否为1
re = (re*a);
}
n >>= 1; // 舍去n的最后一位
a = (a*a); // 将a平方
}
return re;
}
int main()
{
ll a,n;
cin >> a >> n; // 读入a和n
ll ans = qpow(a,n);
cout << ans << endl;
return 0;
}
因为计算结果一般都很大,很多题目都要求对结果去模。
如:
所以小白在小金的模板上偷抄了一个公式为:(n^n)%10,结果是多少就去追求谁
最好 对整个过程取模,只对算出答案取模可能是错误答案。
#include <bits/stdc++.h>
using namespace std;
// 求a^n%mod a的n次方模mod
typedef long long ll;
int mod;
ll qpow( ll a, ll n )
{
ll re = 1;
while ( n ) {
if ( n&1 ) {
re = (re*a) % mod; // 对此处取模
}
n >>= 1;
a = (a*a) % mod; // 对此处取模
}
return re % mod; // 对返回值取模
}
int main()
{
ll a,n;
cin >> a >> n;
cin >> mod; // 读入mod
ll ans = qpow(a,n);
cout << ans << endl;
return 0;
}