文章
99
粉丝
120
获赞
8
访问
99.0k
// 快速幂经典题
#include <bits/stdc++.h>
using namespace std;
//定义模
#define MOD 233333;
//快速幂算法:
//其实就是二分思想,把幂减半后,减少计算时间
//n为偶数,a^n=a^(n/2)*a^(n/2)
//n为奇数,a^n=a^(n-1)*a,相当于把奇数变为偶数,再计算
//不求模版本
long long int qpow(long long a, long long n)
{
long long ans = 1;
while (n)
{
if (n % 2 == 1) //指数是奇数,先做一步乘法,化成偶数
{
ans = ans * a;
}
a = a * a;
n = n / 2;
}
return ans;
}
//求摸版本
//首先明白求模运算优先级:与乘法、除法相同,小于幂。所以代码里面是先计算乘法,再求模
//其次就是求模运算的规则:(a*b)%p=((a%p) * (b%p))%p
//核心思想:每做一次乘法去一次模,最后对返回结果再取一次模
long long int qpow_mod(long long a, long long n)
{
long long ans = 1;
a = a % MOD; //按照运算法则,这一步是必须的,防止a>mod的情况出现。补全这个才算满足了上面的分配率
//while中,因为a和ans都是保证小于MOD的(ans来源于上一次运算的%mod),因此无需再执行内部的%,只需执行最外侧的%
while (n)
{
if (n % 2 == 1)
{
ans = (ans * a) % MOD;
}
a = (a * a) % MOD;
n = n / 2;
}
return ans;
}
in...
登录后发布评论
暂无评论,来抢沙发