快速冪

題目描述

輸入b,p,k的值,求b^p mod k的值。其中b,p,k*k爲長整型數。c++

輸入輸出格式

輸入格式:spa

 

三個整數b,p,k.code

 

輸出格式:blog

 

輸出「b^p mod k=s」ci

s爲運算結果it

輸入輸出樣例

輸入樣例#1:
2 10 9
輸出樣例#1: 
2^10 mod 9=7

 

 以b==11爲例,b=>1011,二進制從右向左算,但乘出來的順序是 a^(2^0)*a^(2^1)*a^(2^3),是從左向右的。咱們不斷的讓base*=base目的便是累乘,以便隨時對ans作出貢獻。io

#include<bits/stdc++.h>
using namespace std;
long long  b,p,k;
long long  mod(long long  a,long long  b) {
    long long  ans=1;// 迭代記錄乘積
    while(b) {
        if(b&1) {
            ans*=a;
            ans%=k;
        }
        a*=a;//這裏是關鍵求出了base-->base2-->base4-->base8-->base16-->base^32.......指數正是 2^i  ,這豈不完美乎?
        a%=k;
        b>>=1;
    }
    return ans;
}
int main() {
    cin>>b>>p>>k;
    cout<<b<<'^'<<p<<" mod "<<k<<'='<<mod(b,p)%k;//b的p次方
    return 0;
}

 

# 更新注意事項:

class

注意中間的取模,被坑過一次二進制

相關文章
相關標籤/搜索