算法分析与设计 | |||||
时间 | 2020.4.25 | ||||
实验名称 | 高级模运算 | ||||
实验目的 | 通过在线实验,要求掌握分治算法的问题描述、算法设计思想、程序设计。 | ||||
实验原理 | 设计一个算法,利用分治的思想,根据题目所给出的条件,求解高级模运算。 | ||||
实验步骤 | 问题描述大致意思为,计算出Σ0<i<H(AiBi%M)%M; 问题分析如果直接计算Ai的Bi次幂再求模,很可能会出现溢出现象,因此对于(AiBi%M),我们将AiBi分解为(Ai×Ai×...×Ai)%M;而乘法与模运算是可结合的,因此可以将(AiBi%M)分解为((Ai%M)×(Ai%M)×...×(Ai%M))%M,即先令对M取模的操作深入到算式中,这样不会产生溢出现象; 因此,这道题可以利用快速幂取模的方法来求解; 求解步骤
| ||||
关键代码(带注释)1. 快速幂取模函数(1)初始令ans = 1,用来存放累积的结果。 (2)判断b的二进制末尾是否为1 ,(及判断 b&1 是否为 1),也可以理解为判断b 是否为奇数。如果是的话,令ans乘上a的值。 (3)令a平方,并使b右移一位,(也可以理解为,b/2) (4)只要b 大于0,就返回(2) 2. 主函数对于输入的每一对A、B,都使用快速幂求模的方法求得结果加入到sum中,并且令sum%M,最后处理完所有的A、B后sum即为结果; | |||||
测试结果 | 运行结果截图及分析对于题目样例:运行无误; 时间复杂度分析:该算法的主要部分为遍历输入的A、B对序列,都需要进行快速幂运算,快速幂运算得时间复杂度为O(log n),因此整个问题的时间复杂度为O(nlogn); | ||||
实验心得 | 这个问题的难点在于求幂过程中防止出现溢出的现象,因此只要将在快速幂的过程中加入取模的操作即可;输入的A、B可能为231,超出int范围,因此对这两个数应该定义为long型或longlong型; 整体问题需要满足时间和空间资源的限制,所以必须要注意一些细节,比如使用scanf而不是cin等; |
算法设计二(4)——高级模运算
最新推荐文章于 2023-12-19 12:49:53 发布