栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++:快速幂模板

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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//头文件
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("%lldn",quickpower(a,b,p));
    return 0;
}

 THE END

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/989617.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号