ZZW's Blog

Step by step!


  • 首页

  • 关于

  • 标签12

  • 分类6

  • 归档22

  • 搜索

快速幂&快速乘法取模例题汇总

发表于 2019-02-08 更新于 2020-07-03 分类于 算法训练
本文字数: 1.8k 阅读时长 ≈ 2 分钟

luogu P1226.【模板】快速幂||取余运算

题目描述:

输入b,p,k的值,求 $b^p$ mod k的值。其中b,p,k * k为长整型数。

输入格式:

三个整数b,p,k.

输出格式:

输出“b^p mod k=s”,s为运算结果。

输入样例:

1
2 10 9

输出样例:

1
2^10 mod 9=7

思路:

特判一个坑点:1^0 mod 1 = 0。

AC代码1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a, b, mod;
LL quick_mul(LL a, LL b, LL mod){ //快速乘法取模
LL res = 0LL;
while(b) {
if(b & 1) res = (res + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return res;
}
LL quick_mod(LL a, LL b, LL mod) { //快速幂取模
LL res = 1LL;
while(b) {
if(b & 1) res = quick_mul(res, a, mod);
a = quick_mul(a, a, mod);
b >>= 1;
}
return res;
}
int main() {
while(cin >> a >> b >> mod) {
cout << a << "^" << b << " mod " << mod << "=" ;
if(b == 0LL && mod == 1LL) cout << 0 << endl; //特判
else cout << quick_mod(a, b, mod) << endl;
}
return 0;
}

AC代码2:

1
2
3
4
5
tot = input().split()
a = int(tot[0])
b = int(tot[1])
mod = int(tot[2])
print(str(a) + "^" + str(b) + " mod " + str(mod) + "=" + str(pow(a, b, mod)))

luogu T50035 我才是签到题

题目描述:

输入b,p,k的值,求 $ b^p $ mod k的值。

输入格式:

输入三个整数b,p,k.

输出格式:

输出答案

输入样例:

1
2 10 9

输出样例:

1
7

说明

$ 0 \leq b, p < 2^{63} $
$ 1 \leq k< 2^{63} $

思路:

注意数据类型全开unsigned long long,同样特判:1^0 mod 1 = 0。

AC代码1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
LL a, b, mod;
LL quick_mul(LL a, LL b, LL mod){ //快速乘法
LL res = 0LL;
while(b) {
if(b & 1) res =(res + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return res;
}
LL quick_mod(LL a, LL b, LL mod) { //快速幂取模
LL res = 1LL;
while(b) {
if(b & 1) res = quick_mul(res, a, mod);
a = quick_mul(a, a, mod);
b >>= 1;
}
return res;
}
int main() {
while(cin >> a >> b >> mod) {
if(b == 0LL && mod == 1LL) cout << 0 << endl; //特判
else cout << quick_mod(a % mod, b, mod) << endl;
}
return 0;
}

AC代码2:

1
2
3
4
5
tot = input().split()
a = int(tot[0])
b = int(tot[1])
mod = int(tot[2])
print(pow(a, b, mod))
  • 本文作者: wzomg
  • 本文链接: http://blog.wzomg.cn/posts/cf940335.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
快速幂&快速乘法取模
(扩展)中国剩余定理例题汇总
(扩展)欧拉定理例题汇总
  • 文章目录
  • 站点概览
wzomg

wzomg

A thousand miles begins with a single step.
22 日志
6 分类
12 标签
GitHub E-Mail 博客园 简书
Creative Commons
  1. 1. luogu P1226.【模板】快速幂||取余运算
    1. 1.1. 题目描述:
    2. 1.2. 输入格式:
    3. 1.3. 输出格式:
    4. 1.4. 输入样例:
    5. 1.5. 输出样例:
    6. 1.6. 思路:
    7. 1.7. AC代码1:
    8. 1.8. AC代码2:
  2. 2. luogu T50035 我才是签到题
    1. 2.1. 题目描述:
    2. 2.2. 输入格式:
    3. 2.3. 输出格式:
    4. 2.4. 输入样例:
    5. 2.5. 输出样例:
    6. 2.6. 说明
    7. 2.7. 思路:
    8. 2.8. AC代码1:
    9. 2.9. AC代码2:
© 2019 – 2021 wzomg  粤ICP备19066467号-1 | 113k | 1:43
0%