a^b(快速幂模板题)

题目描述

求 a 的 b 次方对 p 取模的值。

输入格式

三个整数 a,b,p,在同一行用空格隔开。

输出格式

输出一个整数,表示\small a^b mod\ p的值。

数据范围

0≤a,b≤\small 1e9

1≤p≤\small 1e9

第一篇文章当然要好好纪念一下啦,又不是每篇都是第一篇~~~

快速幂板子题,直接套快速幂即可。

原理 

快速幂基本思想就是将b用二进制进行表示,写为2的次方之和。那么\small a^b可以写为------------------------\small a^{c_{k-1}*2^{k-1}+c_{k-2}*2^{k-2}+c_{k-3}*2^{k-3}....+c_{0}*2^{0}}。所以对于b的二进制如果第i位(从0开始算)是1,则b的用2的次方表示的表达式中肯定有\small 2^i,所以a的次方中也肯定有这一项,所以对b进行移位,判断最低位是否为1,如果是就乘进去,如果不是就继续移位。同时我们可以压缩指数,因为3^6=(3^2)^3=9^3,所以我们只需要每次将低数平方,指数减小一般即可。当然位运算速度快于算术运算,所以我们采用&运算符判断低位是否为1,>>进行除以2操作。

此外为了实现mod操作,需要我们掌握:

\small \newline (a + b) % p = (a % p + b % p) % p\newline \newline (a - b) % p = (a % p - b % p ) % p\newline \newline (a * b) % p = (a % p * b % p) % p\newline

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void kuaisumi(ll a,ll b,ll p)
{
    ll ans=1;
    while(b)
    {
        if(b&1)
        {
            ans=((ans%p)*(a%p))%p;
        }
        a=((a%p)*(a%p)%p);
        b>>=1;
    }
    cout<<ans%p<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    ll a,b,p;cin>>a>>b>>p;
    kuaisumi(a,b,p);
    system("pause");
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值