C++:快速幂模板

求模运算

PS:链接:没有的同学请注册登录 - 沐枫OJhttps://www.mfstem.org/p/598

        输入a、b、p,输出a ^ b mod p 的值。

        数据范围(1 ≤ a、b、p ≤ 10¹⁸)

输入:2 10 9
输出:7

        乍一看,你有没有想做循环的想法

        一看数据......爆了

        那么,该怎么办呢?

        二进制......

        好像可以耶

        用二进制拆分b

        我们用ans记录答案,因为是乘法,别忘记初始化为1

        看样例吧
       10 = (1010)₂

        用while拆位

while(z > 0){
    
}

       用一个变量sum计算现在的单位,初始化为a

        如果这个二进制位是1

        ans *= sum

        ???

        敲黑板啦!!!

        a^10 = a^8*a^2

        道理很简单,对不对

if(z % 2 == 1){
    ans *= sum;
    ans %= m;
}

        OK

        二进制的单位sum自乘sum来到下一个单位

sum *= sum;
sum %= m;

         最后的最后

z /= 2;

        来到下一位

        该讲的讲完了,来到可爱的代码环节qwq

#include<bits/stdc++.h>//头文件
using namespace std;
#define int long long
int a,b,p;
int quickpower(int d,int z,int m){//快速幂
    int ans = 1,sum = a;
    while(z){
        if(z % 2 == 1){
            ans *= sum;
            ans %= m;
        }
        sum *= sum;
        sum %= m;
        z >>= 1;
    }
    return ans;
}
signed main(){
    cin >> a >> b >> p;
    printf("%lld\n",quickpower(a,b,p));
    return 0;
}

 THE END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值