【蓝桥杯】ADV-204 快速幂
- 2019 年 11 月 13 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/102989593
题目描述:
给定A, B, P,求(A^B) mod P。
输入描述:
输⼊共⼀⾏。 第⼀⾏有三个数,N, M, P。(A, B为long long范围内的⾮负整数,P为int内的⾮负整数)。
输出描述:
一个整数,表示箱子剩余空间。
输入样例:
2 5 3
输出样例:
2
解题思路:
整数快速幂的时间复杂度是

,可以防止TLE,有非递归和递归俩种算法,我是看晴神的《算法笔记》上理解的。
AC代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll quickPow(ll x,ll n,ll m) //整数快速幂,计算x^n%m { ll ans = 1; x %= m; while(n) { if(n&1) //奇数 { ans = ans*x%m; } x = x*x%m; n >>= 1; } return ans; } ll binaryPow(ll x,ll n,ll m) //整数快速幂,计算x^n%m递归求解 { if(n == 0) return 1; //若n为0,则x^0=1 else if(n&2) //若n为奇数,转换为n-1 { return n*binaryPow(x,n-1,m)%m; } else //若n为偶数,转换为n/2 { ll ans = binaryPow(x,n/2,m); return ans*ans%m; } } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); ll a,b,m; cin >> a >> b >> m; cout << quickPow(a,b,m) << endl; return 0; }