博客
关于我
《算法竞赛进阶指南》0x01 T1 a^b
阅读量:269 次
发布时间:2019-03-01

本文共 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<

转载地址:http://lnho.baihongyu.com/

你可能感兴趣的文章
继承和派生1
查看>>
七月十一日训练总结
查看>>
约瑟夫环问题
查看>>
Nim博弈与SG函数入门
查看>>
CF #716 (Div. 2) B. AND 0, Sum Big(思维+数学)
查看>>
数据结构与算法实验1——线性表的应用之顺序表
查看>>
重温冒泡排序
查看>>
阿里云数据库连接MySql
查看>>
SQLyog(MySQL图形化开发工具)
查看>>
MySQL报错记录一下10061或者非自己的IP
查看>>
純前端 - 各種實現進度條
查看>>
Java 設計模式 - 建造者模式
查看>>
ES6 JavaScript 重新認識 Promise
查看>>
前端優化 - 防抖與節流
查看>>
Spring--04--AOP增强
查看>>
2020-07-16:如何获得一个链表的倒数第n个元素?
查看>>
2020-11-04:java里,总体说一下集合框架。
查看>>
2020-12-04:mysql 表中允许有多少个 TRIGGERS?
查看>>
2020-12-10:i++是原子操作吗?为什么?
查看>>
2021-01-12:多维快查多维查询系统,你了解的解决方案都有哪些?
查看>>