文章

37

粉丝

68

获赞

6

访问

7.0k

头像
1017 幂次方
综合
发布于2024年3月6日 10:54
阅读数 148

// 快速幂经典题
#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...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发