quickpow || 快速幂

洛谷例题

推荐自行脑补:百度百科

如果  ,那么 

前言:快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

拿题目样例

Input :2 10 9

Output:7

210 % 9 = 7 没毛病

问题不大 那么真正的问题是怎么算这个

普通幂:废物过程 可你有没有发现这个很烦?

可是 算到264就炸了qwq (__int128啥的给我走开)

b=2,p=10,k=9
2^1=2 2%9=2 
2^2=4 4%9=4 
2^3=8 8%9=8 
2^4=16 16%9=7 
2^5=32 32%9=5 
2^6=64 64%9=1
2^7=128 128%9=2
2^8=256 256%9=4
2^9=512 512%9=8
2^10=1024 1024%9=7

 

 


 

递推幂:甚至还可以在优化 成 bk-1%p*b

 

其实也就是递推 这样就好一丢丢吧 大数字的时候可以这样暂且优化一下(至少不容易爆精度)

也是比较有实用性的 orz 这样就可以得到 

a[1] = b ;
    for (register int i=2;i<=k;i++) a[i] = a[i-1] % p * b ;

 

这样不就是个递推了吗 海星 用数组只是好理解 而且不太会爆精度 不知道多少分(应该比较优秀的分数吧

b=2,p=10,k=9
2%9=2 
2*2%9=4 
4*2%9=8 
8*2%9=7 
7*2%9=5 
5*2%9=1
1*2%9=2
2*2%9=4
4*2%9=8
8*2%9=7

看图 其实有一部分是循环节(我还复制了) 可以通过循环节来处理加速(不建议万一没有循环节呢

mod:是时候叫出快速幂(超级飞侠)来帮忙了 每次遇到困难...(不玩梗了


快速幂:

快速幂代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
inline LL quickpow (LL x , LL y , LL mod){ LL ans = 1;//自定义函数可作为快速幂模型
    for ( ; y ; x = x * x % mod , y >>= 1) y & 1 ? ans = ans * x % mod : 0;
    return (LL) ans % mod ;
}
signed main() {
    LL b,k,p;
    cin >> b >> k >> p ;
    cout << b << '^' << k << " mod " << p << '=' << quickpow(b , k , p) << endl ;
    return 0;
}

这个代码可以作为模板使用

(背就完事了哪那么多话)

转载于:https://www.cnblogs.com/qf-breeze/p/10415945.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值