【模板】快速幂||取余运算

简介: 【模板】快速幂||取余运算

链接

快速求$a^b$

  1. 如果将a自乘一次,就会变成$a^2$。再把$a^2$自乘一次就会变成$a^4$,然后是$a^8$……自乘n次的结果是$a^{2^n}$
  2. $a^x$$a^y$=$a^{x+y}$

    int quickPower(int a, int b)//是求a的b次方
    {
       int ans = 1, base = a;//ans为答案,base为a^(2^n)
       while(b > 0)//b是一个变化的二进制数,如果还没有用完
       {
           if(b & 1)//&是位运算,b&1表示b在二进制下最后一位是不是1,如果是:
               ans *= base;//把ans乘上对应的a^(2^n)
    
           base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
           b >>= 1;//位运算,b右移一位,如101变成10(把最右边的1移掉了),10010变成1001。现在b在二进制下最后一位是刚刚的倒数第二位。结合上面b & 1食用更佳
       }
       return ans;
    }
  3. 取余运算

(A + B) mod b = (A mod b + B mod b) mod b
(A × B) mod b = ((A mod b) × (B mod b)) mod b

while(b > 0)
    {
        if(b & 1)
        {
            ans *= base;
            ans %= m;
            /*ans=(ans*base)%K*/
        }
        base *= base;
        base %= m;
        b >>= 1;
    }

能保证这样下来最后的结果与“先乘到最后,再取余”的结果一样。

#include<cstdio>
#include<iostream>
using namespace std;
long long a,b,k;
long long ksm(long long a,long long b){
    long long base=a,ans=1;
    while(b>0){
        if(b&1){
            ans*=base;
            ans%=k;
        }
        base*=base;
        base%=k;
        b>>=1;
    }
    return ans%k;
}
int main(){
    cin>>a>>b>>k;
    cout<<a<<"^"<<b<<" mod "<<k<<"="<<ksm(a,b);
    return 0;
}
目录
相关文章
|
21天前
|
C语言
C语言之九九乘法表||素数||最小公倍数
C语言之九九乘法表||素数||最小公倍数
22 0
|
9月前
|
算法
P1226 【模板】快速幂||取余运算
P1226 【模板】快速幂||取余运算
30 0
|
23天前
分解质因数答疑 为什么只需要枚举到根号N 为什么n % i == 0就是质数
分解质因数答疑 为什么只需要枚举到根号N 为什么n % i == 0就是质数
35 0
|
23天前
leetcode-372:超级次方(快速幂的实现以及取余的规则和推导)
leetcode-372:超级次方(快速幂的实现以及取余的规则和推导)
24 0
|
23天前
|
Python
素数(prime number)又称质数,有无限个。除了1和
素数(prime number)又称质数,有无限个。除了1和
|
10月前
判断一个数字是否是回文数||取整与取余
判断一个数字是否是回文数||取整与取余
61 0
|
12月前
|
算法
不使用+或-运算符,计算两数之和
不使用+或-运算符,计算两数之和
49 0
|
文件存储
【每日一题Day51】LC1780判断一个数字是否可以表示成三的幂之和 | 进制转换
思路:当我们把二进制转换为十进制时,采用的方法是二的幂之和。那么,本题可以将十进制转换为三进制,当所有位的值为0或者1时,满足题意,返回true;但有一位值为2时,返回false
53 0
|
C语言
C语言(素数)[解法]:编写prime(m)判断m是否为素数,当m为素数返回1,否则返回0;
C语言(素数)[解法]:编写prime(m)判断m是否为素数,当m为素数返回1,否则返回0;
312 0
求实数的整数次幂(循环版)(高效)(位运算解题)
说明:参数 x 为底数,n 为指数。若参数正确,则函数值为 x 的 n 次幂。若参数不正确(当底数为 0 且指数为 0 或负数时无意义),则报告错误,函数值为0。// 这个位运算是大部分都不熟悉也不敢用的东西,但是确实是编程里面的一个非常重要的工具。请编写函数,用循环语句以最快的方法求任意实数的任意整数次幂。要求:不得调用 pow 函数,不得使用递归方法。指数 二进制 公式。
150 0
求实数的整数次幂(循环版)(高效)(位运算解题)

热门文章

最新文章