acm数论之旅(转载) -- 快速幂

快速幂运算详解
本文深入讲解了快速幂运算的原理及应用,包括直接循环、递归和递推三种实现方式,特别关注大数运算和求余操作。通过具体实例解析,帮助读者掌握高效计算大指数幂的方法。
部署运行你感兴趣的模型镜像

 0和1都不是素数,也不是合数。

a的b次方怎么求

pow(a, b)是数学头文件math.h里面有的函数

可是它返回值是double类型,数据有精度误差

 

那就自己写for循环咯

复制代码
LL pow(LL a, LL b){//a的b次方
    LL ret = 1;
    for(LL i = 1; i <= b; i ++){
        ret *= a;
    }
    return ret;
}
复制代码

 

完美

 

 

可是题目是b的范围是1 <= b <= 1e9(#°Д°)

超时,妥妥的。。。

 

 

 

看个例子

比如计算

2*2*2*2*2*2*2*2*2*2*2

可以这样算

原式=4*4*4*4*4*2

=8*8*4*2

=16*4*2

你看,相同的可以先合并,减少计算步骤

 

如果题目说数据很大,还需要求余,那么代码就可以这么写

复制代码
1 LL pow_mod(LL a, LL b, ll MOD){//a的b次方
2     if(b == 0) return 1;
3     LL ret = pow_mod(a * a % MOD, b/2, Mod);
5     if(b & 1) ret = ret * a % MOD;
6     return ret;
7 }
复制代码

 

这是递归写法

然后还有递推写法

 

复制代码
 1 LL pow_mod(LL a, LL b){//a的b次方
 2     LL ret = 1;
 3     while(b != 0){
 4         if(b % 2 == 1){
 5             ret = (ret * a) % MOD ;
 6         }
 7         a = (a * a ) % MOD ;
 8         b /= 2;
 9     }
10     return ret;
11 }
复制代码

 

 

对于位运算熟的小盆友,还可以写成位运算形式,速度又快,又好理解,在加一个求余p,代码如下

 

 

复制代码
1 LL pow_mod(LL a, LL b, LL p){//a的b次方求余p 
2     LL ret = 1;
3     while(b){
4         if(b & 1) ret = (ret * a) % p;
5         a = (a * a) % p;
6         b >>= 1;
7     }
8     return ret;
9 }
复制代码

 

 

有了快速幂,于是,快速乘诞生了

复制代码
1 LL mul(LL a, LL b, LL p){//快速乘,计算a*b%p 
2     LL ret = 0;
3     while(b){
4         if(b & 1) ret = (ret + a) % p;
5         a = (a + a) % p;
6         b >>= 1;
7     }
8     return ret;
9 }
复制代码

 https://vjudge.net/contest/240113#problem/J

解释

https://blog.youkuaiyun.com/rain722/article/details/64442335

https://blog.youkuaiyun.com/wanghandou/article/details/69666620

题意:
         输入n^k,输出n^k的前3位与后3位.

思路:
最后的三位可以直接快速幂取余,但要注意不够要补前导0.

求前三位则需要一些数学知识对于给定的一个数n,它可以写成10^a,其中这个a为浮点数,则n^k=(10^a)^k=10^a*k=(10^x)*(10^y);

其中x,y分别是a*k的整数部分和小数部分对于t=n^k这个数,它的位数由(10^x)决定,它的位数上的值则有(10^y)决定,因此我们

要求t的前三位,只需要将10^y求出,再乘以100,就得到了它的前三位。

fmod(x,1)可以求出x的小数部分

                                                                                   
           

转载于:https://www.cnblogs.com/downrainsun/p/9755074.html

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值