快速幂+大乘法运算

(快速幂+位运算)

0 ≤ a , b ≤ 1 0 9 0 ≤ p ≤ 1 0 9 0\le a,b\le 10^9\\ 0\leq p \leq 10^9 0a,b1090p109
快速幂:
(1)取模运算法则

  • (a + b) % p = (a % p + b % p) % p
  • (a - b) % p = (a % p - b % p ) % p
  • (a * b) % p = (a % p * b % p) % p

(2)快速幂可以在O(logk)内算出 a k a^k akmod p的值
先处理出:
a 2 0   m o d   p a^{2^0} \ mod \ p a20 mod p
a 2 1   m o d   p a^{2^1} \ mod \ p a21 mod p
a 2 2   m o d   p a^{2^2} \ mod \ p a22 mod p
a 2 3   m o d   p a^{2^3} \ mod \ p a23 mod p
a 2 4   m o d   p a^{2^4} \ mod \ p a24 mod p

a 2 l o g k m o d      p a^{2^{logk}} \mod \ p a2logkmod p
只需要把k处理成二进制就可以了
那如何进行预处理呢?
a 2 0 a 2 1 2 = a 2 2 以此类推 a^{2^0}\\ {a^{2^1}}^2 = a^{2 ^ 2}\\ 以此类推 a20a212=a22以此类推
全开LL避免溢出

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
LL a,b,p;


LL qmi(LL &a,LL &b, LL &q)
{
    LL res = 1 % q;
    while(b)
    {
        if(b & 1) res = res * a % q;
        a = a * a % q;
        b >>= 1;
    }
     return res;
    
}

int main()
{
    cin >> a >> b >>p;
    cout << qmi(a,b,p)<<endl;
    
    return 0;
}

例:
求 a * b % p 的值
1 ≤ a , b , p ≤ 1 0 18 1\le a,b,p \le 10^{18} 1a,b,p1018
Py自带高精度,所以虐杀
a = input()
b = input()
p = input()
print(a * b % p)
C++代码可以用位运算来做
可以参考上述快速幂的思想,a * b = a + a + a + a…+ a
a 2a 4a 8a 16a …

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
LL res(LL &a, LL &b, LL &p)
{
    LL res1 = 0;
    while(b)
        {
            if(b & 1) res1 = (res1 + a) % p;
            a = a * 2 % p;
            b >>= 1;
        }
    return res1;
}

int main()
{
    LL a, b ,p;
    cin >> a >> b >> p;
    cout << res(a, b, p)<<endl;
    return 0;
}

上一章:递归实现三类枚举

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕噜咕噜咕噜128

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值