快速幂讲解-And-AcWing-89. a^b-《算法竞赛进阶指南》

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂讲解-And-AcWing-89. a^b-《算法竞赛进阶指南》相关的知识,希望对你有一定的参考价值。

快速幂

题目描述

a a a b b b次方对 m o d mod mod取模的值

1 ≤ a , b , m o d ≤ 1 0 9 1\\leq a,b,mod\\leq 10^9 1a,b,mod109

问题分析

每个正整数可以唯一表示为若干指数不重复的 2 2 2的次幂的和。

b b b在二进制表示下有 K K K位,其中第 i ( 0 ≤ i < k ) i(0\\leq i < k) i(0i<k)位的数字是 c i c_i ci,那么:

b = c k − 1 2 k − 1 + c k − 2 2 k − 2 + ⋯ + c 0 2 0 b=c_{k-1}2^{k-1}+c_{k-2}2^{k-2}+\\cdots+c_02^0 b=ck12k1+ck22k2++c020

因此:

a b = a c k − 1 2 k − 1 ∗ a c k − 2 2 k − 2 ∗ ⋯ ∗ a c 0 2 0 a^b=a^{c_{k-1}2^{k-1}}*a^{c_{k-2}2^{k-2}}*\\cdots*a^{c_02^0} ab=ack12k1ack22k2ac020

也就是说如果 b b b的第 i i i c i c_i ci 0 0 0,那么 a c i 2 i a^{c_{i}2^{i}} aci2i就等于 a 0 = 1 a^0=1 a0=1;如果 c i c_i ci 1 1 1,那么就等于 a 2 i a^{2^i} a2i

又有 a 2 i = ( a 2 i − 1 ) 2 a^{2^i}=(a^{2^{i-1}})^2 a2i=(a2i1)2,而 k = l o g 2 ( ⌈ b + 1 ⌉ ) k=log_2(\\lceil b+1\\rceil) k=log2(b+1) ⌈ ⌉ \\lceil\\rceil 表示向上取整),故时间复杂度为 O ( l o g 2 b ) O(log_2b) O(log2b)

所以每次取 b b b中的 1 1 1位( b & 1 , b > > = 1 b\\&1,b>>=1 b&1,b>>=1),每次 a a a都平方( a = a ∗ a % m o d a=a*a\\%mod a=aa%mod),如果 b b b的这一位是 1 1 1就累积到 a n s ans ans中。


快速幂模板

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

a a a b b b次方对 m o d mod mod取模的值

Tips

1 ≤ a , b , m o d ≤ 1 0 9 1\\leq a,b,mod\\leq 10^9 1a,b,mod109


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;
}

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/119147195

以上是关于快速幂讲解-And-AcWing-89. a^b-《算法竞赛进阶指南》的主要内容,如果未能解决你的问题,请参考以下文章

快速幂(讲解)

转载快速幂讲解

22-快速幂讲解

快速幂模板及讲解

快速幂

常用算法模板 | 快速幂