快速幂

#include<bits/stdc++.h>
using namespace std;
//快速求幂,就是二分法
long long mod=1000000007L;
long long pow1(int x,int y){
    //判断奇偶,偶数返回0奇数返回1
    if(y==0) return 1;
    long long q=pow1(x,y/2);//注意只调用一遍,否则On
    if(y&1) return q*q*x;
    else return q*q;
}
//带模,其实就是之前做过的,a^b mod n 的题
long long pow_mod(int x,int y,int c){
    //判断奇偶,偶数返回0奇数返回1
    if(y==0) return 1;
    long long q=pow_mod(x,y/2,c)%c;//注意只调用一遍,否则On
    if(y&1) return (q*q*x)%c;
    else return (q*q)%c;
}
//位运算的方式,改成迭代,根据二进制
int pow_mod_bit(int x,int y,int c){
    int s=1;
    while (y>0)
    {
        //末尾是1
        if(y&1){
            s=(s*x)%c;
        }
        y>>=1;
        x=(x*x)%c;
    }
    return s;
}
int main()
{
    cout<<pow1(2,33)<<endl;
    cout<<pow_mod(2,109,111)<<endl;
    cout<<pow_mod_bit(2,10,10)<<endl;
    return 0;
}

 

posted @ 2020-06-06 21:42  西伯利亚挖土豆  阅读(176)  评论(0编辑  收藏  举报