码迷,mamicode.com
首页 > 其他好文 > 详细

快速幂

时间:2020-02-21 16:19:20      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:快速   复杂度   快速幂   return   ace   string   res   span   include   

快速幂的用法及推导

之前算一个\(a^k\)时间复杂度是\(O(K)\).搞一个循环不断的相乘

现在是\(O(logk)\)

在30次之内算出来

核心思想:反复平方法

等号两边同时模一个数,那个大小是不变的

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;

LL qmi(int a, int n, int mod)
{
    LL res = 1 % p;  // 当 p = 1, b = 0的时候是有区别的  
    while(n)
    {
        if(n & 1)  res = res * a % mod;
        a = a * (LL) a % mod;
        n >>= 1; 
    }
    return res;
}


int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int a, b, p;
        cin >> a >> b >> p;
        cout << quick_mod(a, b, p) << endl;
    }
    return 0;
}

快速幂求逆元

除法取余数是很麻烦的一件事情

a/b = ax (mod m)

x是b的mod m的逆元

逆元是一个整数只是一个标记

相除不一定是整数,相乘是整数

bx mod m == 1

费马定理

快速幂

标签:快速   复杂度   快速幂   return   ace   string   res   span   include   

原文地址:https://www.cnblogs.com/WalterJ726/p/12341686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!