快速幂

快速幂——小白系列

快速幂

今天你吃卡苏米了吗?

快速幂在OI也是很重要的一个小技能
正如它的名字,快速幂是一个能快速求出一个数的n次方的方法
那么怎么做到的呢?
同是C++代码,你为何如此优秀

原理

我们来拿2^20来举例
常规做法是用2乘自己,用20个2相乘便可求出
但是我们发现 实际上我们只需要求4^10就可以了
结果一样,时间复杂度却降了一半

那么同理,要想求4^10,我们只需要求16^5就好

写到这里,我们发现出了一点小问题,5不能再分下去了。
怎么办呢
其实也很简单,我们只需要把16^5写成16*16^4的形式,就可以再分下去了
再来一次就变成了16*256^2
要保证次数大于0,所以最后是16*256*256

理解了原理,我们再来看代码

#include
#include
#include
#include
#include 
using namespace std;
long long b,p,k;
long long ans=1;
int main()
{
    scanf("%d%d%d",&b,&p,&k);//计算b^p mod k 
    if(p==0)
        ans=1%k;
    while(p>0) 
    {
        if(p%2!=0)//判断p是奇数还是偶数 
        ans=ans*b%k;//如果是奇数,则先乘 
        b=b*b%k;//底数变为原来的平方 
        p=p>>1;//指数除以2 
    }    
    cout<

今天的快速幂教程就到这里了
感谢大家支持

愿你的心中还有诗和远方

你可能感兴趣的:(程序技巧)