《算法竞赛进阶指南》0x01 T1 a^b
发布日期:2021-05-04 20:14:44 浏览次数:11 分类:技术文章

本文共 1783 字,大约阅读时间需要 5 分钟。

题目描述

a b a^b ab m o d mod mod p p p 的值。

输入格式

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

输出格式

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

数据范围

0 0 0 ≤ \leq a a a , b b b ≤ \leq 1 0 9 10^9 109

1 1 1 ≤ \leq p p p ≤ \leq 1 0 9 10^9 109

输入样例

3 2 7

输出样例

2

题解

算法1:直接计算 O ( b ) O(b) O(b)

直接使用C++中的 p o w ( a , b ) pow(a,b) pow(a,b) 函数计算 a a a b b b次方(当然也可以通过for循环实现此函数),再将最后的结果 m o d mod mod p p p

考虑到本题的数据范围过大,取模前的结果可能非常的大,因此选择使用 u n s i g n e d unsigned unsigned l o n g long long l o n g long long 存储该结果

code
#include
using namespace std;long long a,b,p;//unsigned long long power(long long a,long long b) //手写pow函数 //{ // long long result=1;// for(int i=1;i<=b;i++)// result=result*a;// return result;//}int main(){ cin>>a>>b>>p; unsigned long long x; x=pow(a,b);// x=power(a,b); cout<

算法2:取模运算优化 O ( b ) O(b) O(b)

在算法1的基础上进行优化

依据取模运算中的 ( a (a (a × \times × b ) b) b) m o d mod mod p p p = = = ( a (a (a m o d mod mod p p p × \times × b b b m o d mod mod p ) p) p) m o d mod mod p p p
(取模运算具体内容可参考 )
可以解决空间上的问题,即在每次进行乘法的过程中取模,防止最后的结果过大

code
#include
using namespace std;long long a,b,p;long long power(long long a,long long b){ long long result=1; for(int i=1;i<=b;i++) { result=result*a; result%=p; } return result%p;}int main(){ cin>>a>>b>>p; cout<

算法3:快速幂(正解) O(logb)

通过取模运算解决上了空间的问题,能够计算出正确的结果

但由于b的值过大,循环次数非常多,出现了时间问题
通过快速幂来解决时间问题(快速幂具体内容可参考 )
为了进一步加快时间,可以使用位运算来进行操作

code
#include
using namespace std;long long a,b,p;long long power(long long a,long long b) { long long result=1; while(b>0) { if(b&1) result=result*a%p; //b&1等价于b%2==1 b>>=1; //power>>=1等价于power=power/2 a=(a*a)%p; } return result%p;}int main(){ cin>>a>>b>>p; cout<
上一篇:《算法竞赛进阶指南》0x12 T4 最大子序和
下一篇:【C语言解题篇】必须要会的循环试题!!

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月10日 06时24分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章