我正在参与掘金创作者训练营第5期
@TOC
快速幂
题目描述
求的次方对取模的值
问题分析
每个正整数可以唯一表示为若干指数不重复的的次幂的和。
在二进制表示下有位,其中第位的数字是,那么:
因此:
也就是说如果的第位是,那么就等于;如果是,那么就等于
又有,而(表示向上取整),故时间复杂度为
所以每次取中的位(),每次都平方(),如果的这一位是就累积到中。
快速幂模板
typedef long long ll;
ll power(ll a, ll b, ll mod)
{
ll ans = 1 % mod;
while (b)
{
if (b & 1)
ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
如果要用int:
typedef long long ll;
int power(int a, int b, int mod)
{
int ans = 1 % mod;
while (b)
{
if (b & 1)
ans = (ll)ans * a % mod;
a = (ll)a * a % mod;
b >>= 1;
}
return ans;
}
AcWing-89. a^b
Problem Description
求的次方对取模的值
Tips
AC代码
/*
* @Author: LetMeFly
* @Date: 2021-07-26 17:29:09
* @LastEditors: LetMeFly
* @LastEditTime: 2021-07-26 17:33:08
*/
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
int power(int a, int b, int mod)
{
int ans = 1 % mod;
while (b)
{
if (b & 1)
ans = (ll)ans * a % mod;
a = (ll)a * a % mod;
b >>= 1;
}
return ans;
}
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << power(a, b, c) << endl;
return 0;
}
同步发文于我的CSDN,原创不易,转载请附上原文链接哦~
Tisfy:letmefly.blog.csdn.net/article/det…