Codevs 5208 快速乘快速幂,当数很大时的解决方法(C++)(超long long)

博客给出一个算法题目,要求给定非负整数A、B、M,求(A ^ B) mod M。包含多组输入,处理到EOF,每组输入为三个用空格隔开的非负整数。给出了样例输入输出,还说明了数据范围,仅给出部分关键代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间限制: 1 s
空间限制: 1000 KB
题目描述 Description

给定非负整数A、B、M,求(A ^ B) mod M。

输入描述 Input Description

包含多组输入,输入处理到EOF。
每组输入仅一行,三个用空格隔开的非负整数A、B、M。
输出描述 Output Description
对于每组输入,输出一行,一个非负整数,即(A ^ B) mod M。

样例输入 Sample Input

2 3 100006
32 71 83
900 800 777

样例输出 Sample Output

8
5
219

数据范围及提示 Data Size & Hint

0 <= A, B < 8 * 10^18。

0 < M < 8 * 10^18。

保证A和B不同时为0。

本题仅给出部分关键代码

LL mul(LL a,LL b)
{
    LL ans=0;
    while(b)
    {
        if(b&1) ans=(ans+a)%p;
        a=(a+a)%p;
        b=b>>1;
    }
    return ans;
}
LL Pow(LL a,LL b)//这里可以直接写在main里面,不然对于大数据,会一直调用
{				//会浪费很多时间,遇到过卡这个的题目
    LL result=1;
    LL base=a%p;
    while(b)
    {
        if(b&1) result=mul(result,base);
        base=mul(base,base);
        b=b>>1;
    }
    return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值