一、快速幂基础详解
快速幂算法的核心思想是二分思想(时间复杂度为O(logN)),将幂逐步减半,从而减少计算时间。若计算a^n:
- n为偶数:a^n = a^(n/2) * a^(n/2),偶数直接二分
- n为奇数:a^n = a(n-1) * a,相当于奇数-1变成偶数再计算
无模版本核心代码:
long long qpow(long long a, long long n)
{
long long ans = 1;
while (n)
{
if (n % 2 == 1) //指数是奇数,先做一步乘法,化成偶数
{
//可以理解为,每次遇到奇数幂,就把计算结果的一部分暂存进ans(另一部分是下面的a*a)
ans = ans * a;
}
//偶数不做单独处理,是因为int强制类型转换。即当n为奇数,n/2和(n-1)/2的结果是一样的
a = a * a;
n = n / 2;
}
return ans;
}
有模版本:
- 首先明确计算优先级:取模运算优先级同乘法、除法,小于幂,所以代码里面先计算乘法再取模。
- 其次明确取模运算的规则:(a*b)%p = ((a%p) * (a%p))%p (同余模定理)。
- 核心思想:每做一次乘法就取一次模(内模),最后对返回的结果再取一次模(外模)。
核心代码:
long long qpow_mod(long long a, long long n, long long mod)
{
long long ans = 1;
a = a % mod; //按照运算法则,这一步是必须的,防止a>mod的情况出现。补全这个才算满足了上面的分配率
while (n)
{
if (n % 2 == 1)
{
ans = (ans * a) % mod;
}
a = (a * a) % mod;
n = n / 2;
}
return ans;
}
二、幂次方(贵大机试)
输入输出格式
输入描述
输入两个整数X和N,用空格隔开,其中X,N<=10^9。
输出描述
输出X^N对233333取模的结果。
输入输出样例
输入样例
2 5
输出样例
32
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
long long qpow_mod(long long a, long long n, long long mod)
{
long long ans = 1;
a = a % mod; //按照运算法则,这一步是必须的,防止a>mod的情况出现。补全这个才算满足了上面的分配率
while (n)
{
if (n % 2 == 1)
{
ans = (ans * a) % mod;
}
a = (a * a) % mod;
n = n / 2;
}
return ans;
}
int main()
{
long long x, n;
long long mod = 233333;
while (cin >> x >> n)
cout << qpow_mod(x, n, mod) << endl;
return 0;
}
cout << qpow_mod(x, n) << endl;
return 0;
}