快速幂板子

话不多说,直入正题

题目:洛谷P1226

这里有两种方法完成此题:

第一种是用位运算,第二种是用分治

具体算法详解看https://www.luogu.org/blog/cicos/quickpow大佬的题解;

板子:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    long long b,p,k,ans=1;
    cin>>b>>p>>k;
    cout<<b<<"^"<<p<<" mod "<<k<<"=";
    while(p>0)
    {
        if(p%2==1)
        {
            ans*=b;
            ans%=k;
        }
        b*=b;
        b%=k;
        p=p>>1;
    }
    cout<<ans%k<<endl;
    return 0;
}

 当然,对于一些追求简洁的大佬,我们有:

typedef long long ll;

ll fastmi(ll x,ll y,ll m)//求x^y%m
{
    if(y==0) return 1;
    else if(y==1) return x;
    if(y&1) return (x+fastmi((x*2)%m,y>>1,m))%m;
    else return fastmi((x*2)%m,y>>1,m)%m;
}

 

posted @ 2019-10-29 21:30  kingderman  阅读(188)  评论(0编辑  收藏  举报