快速幂

简介: 快速幂

快速幂AcWing 89. a^b

ab 次方对 p 取模的值。

输入格式

三个整数 a,b,p ,在同一行用空格隔开。

输出格式

输出一个整数,表示a^b mod p的值。

数据范围

0a,b109
1p109

输入样例:

3 2 7
AI 代码解读

输出样例:

2
AI 代码解读

快速计算akmodp

  • 实际上是把k表示成二进制blogkb2b1b0,因此k=b0220+b1221+b2222+blogk22logk
  • 计算akmodp=ab0220+b1221+b2222+blogk22logkmodp=(ab0220modp)×(ab1221modp)××(ablogk22logkmodp)
  • 此外迭代满足如下关系22i+1modp=(22imodp)2
  • 中间结果可能会溢出,要强制进行类型转换
  • 时间复杂度O(logk)

abi=a×a××a,暴力的计算需要O(n)的时间
快速幂使用二进制拆分和倍增思想,仅需要O(Iog)的时间。
对n做二进制拆分,例如,313=3(1101)2=38·34·31
对Q做平方倍增,例如,31,32,34,38
n有logn+1个二进制位,我知道了al,a2,a4,a8,,a2logn
只需要计算logn+1次乘法就可以了。

这里偷懒就用define int long long 了

代码

#include <bits/stdc++.h>

#define int long long
using namespace std;

int qmi(int x, int k, int p) {
   
    int res = 1;
    while (k) {
   
        if (k & 1) res = res * x % p;
        x = x * x % p;
        k >>= 1;
    }
    return res % p;
}

signed main() {
   
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    int a, b, p;
    cin >> a >> b >> p;
    cout << qmi(a, b, p) << endl;
    return 0;
}
AI 代码解读

龟速乘AcWing 90. 64位整数乘法

题目

https://www.acwing.com/problem/content/description/92/

abp 取模的值。

输入格式

第一行输入整数a,第二行输入整数b,第三行输入整数p

输出格式

输出一个整数,表示a*b mod p的值。

数据范围

1a,b,p1018

输入样例:

3
4
5
AI 代码解读

输出样例:

2
AI 代码解读

思路

与快速幂的思想一样,把乘法里面的b用二进制拆分,然后变成b个a相加

此外,还可以使用int128进行计算,但是需要注意强制类型转换

代码

#include <bits/stdc++.h>

#define int long long
using namespace std;

int mul(int a, int b, int p) {
   
    int res = 0;
    while (b) {
   
        if (b & 1) res = (res + a) % p;
        a = (a + a) % p;
        b >>= 1;
    }
    return res;
}

int mul2(int a, int b, int p) {
   
    __int128 aa = a, bb = b, pp = p;
    __int128 res = aa * bb % pp;
    return (int) res;
}

signed main() {
   
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    int a, b, p;
    cin >> a >> b >> p;
    cout << mul2(a, b, p);

    return 0;
}
AI 代码解读
目录
打赏
0
0
0
0
0
分享
相关文章
筛质数、分解质因数和快速幂的应用
筛质数、分解质因数和快速幂的应用
84 0
|
6月前
|
lanqiao OJ 1366 spfa最短路
lanqiao OJ 1366 spfa最短路
36 0
快速幂讲解
快速幂讲解
68 0
华华教月月做数学 两种方法: (快速幂+快速乘) (__int128+快速幂)
华华教月月做数学 两种方法: (快速幂+快速乘) (__int128+快速幂)
99 0
数学问题之(矩阵加速递推快速幂)
数学问题之(矩阵加速递推快速幂)
110 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等