• 【题解】Acwing 89 a ^ b


    a ^ b

    题目传送门

    求 a 的 b 次方对 p 取模的值。
    

    输入格式

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

    输出格式

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

    数据范围

    0≤a,b,p≤109
    数据保证 p≠0
    

    输入样例:

    3 2 7
    

    输出样例:

    2
    

    思路说明:

    快速幂。

    若采用a个b一个个相乘取模的方式来做,它的算法复杂度为O(n)

    而因为

    1. 一位一位的二进制组合可以表示所有的数,即所有数都可以表示为(2^0)+(2^1)+...+(2^n)
    2. a * b mod p = (a mod p) * (b mod p) mod p (咕咕咕,可能之后会在后面补上这数学证明)

    所以我们可以把b用一位一位二进制来表示即可把时间复杂度降为O((log_2b))

    代码展示:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    typedef long long ll; typedef unsigned long long ull;
    ll a, b, p;
    
    inline int qpm(ll a, ll b, ll p) {
        ll ans = 1 % p, t = a % p; // 若没有一开始ans % p 若遇到 0 0 1
        while(b) {
            if(b & 1) ans = ans * t % p; // b & 1 为 true 即 b转成二进制第一位是 1
            t = t * t % p;
            b >>= 1;
        }
        return ans;
    }
    
    int main(){
        scanf("%lld%lld%lld", &a, &b, &p);
        printf("%lld
    ", qpm(a, b, p));
        return 0;
    }
    
  • 相关阅读:
    php 建立类POST/GET 的HTTP请求
    上传文件
    golang精选100题带答案
    go面试
    golang反射
    go语言中type的几种使用
    写个版本迭代的方法 例如1.0.9 迭代为1.1.0 到10自动往前进1
    压缩文件和解压文件
    go语言中的文件创建,写入,读取,删除
    go面试题
  • 原文地址:https://www.cnblogs.com/RemnantDreammm/p/14125549.html
Copyright © 2020-2023  润新知