快速幂算法(c语言)
文章目录
- 前言
- 一、基本思路
- 二、递归式
- 三.例题
- 1. 统计好数字的数目(题目)
- 2.代码
前言
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
一、基本思路
(1)当b是奇数时,那么有 a^b = a * a^*(b-1)
(2)当b是偶数时,那么有 a^b = a^(b/2) * a^(b/2)
例如:
2^10 = 2^5 * 2^5
2^5 = 2 * 2^4
2^4 = 2^2 * 2^2
2^2 = 2^1 * 2^1
2^1 = 2 * 2^0
二、递归式
通过奇数,偶数时的不同情况
typedef long long ll;
ll binaryPow(ll a, ll b, ll m){if(b == 0)return 1;else if(b % 2 == 1) //或(b&1)执行速度更快 判断是否为奇数return a * binaryPow(a, b - 1, m) % m;else{ll num = binaryPow(a, b/2, m) % m; //优化 return num * num % m; // 不直接写成return binaryPow(a, b/2, m) * binaryPow(a, b/2, m)}}
三.例题
1. 统计好数字的数目(题目)
我们称一个数字字符串是 好数字 当它满足(下标从 0 开始)偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 (2,3,5 或 7)。
比方说,"2582" 是好数字,因为偶数下标处的数字(2 和 8)是偶数且奇数下标处的数字(5 和 2)为质数。但 "3245" 不是 好数字,因为 3 在偶数下标处但不是偶数。
给你一个整数 n ,请你返回长度为 n 且为好数字的数字字符串 总数 。由于答案可能会很大,请你将它对 109 + 7 取余后返回 。
一个 数字字符串 是每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。
示例1:
输入:n = 1
输出:5
解释:长度为 1 的好数字包括 “0”,“2”,“4”,“6”,“8” 。
示例2:
输入:n = 4
输出:400
示例3:
输入:n = 50
输出:564908303
2.代码
typedef long long ll;
const int MOD = 1e9 + 7;
ll f(ll a,ll b){ll res = 1; //初始令 res = 1,用来存放累积的结果while(b){ //b!=0即b>0就一直执行循环if(b & 1) //b%2==1res = res * a % MOD; //判断b的二进制末尾是否为1,或理解为判断b是否为奇数。如果是的话,令res乘上a的值。a = a * a % MOD; //令a平方,并使b右移一位b >>= 1; //b/2} return res;
}int countGoodNumbers(long long n){return f(5 , (n + 1) / 2) * f(4 , n / 2) % MOD;
}
快速幂算法(c语言)相关推荐
- 快速幂算法c语言求a的n次方,快速幂算法(数学)
什么是快速幂算法? 快速幂算法能帮我们算出指数非常大的幂,传统的求幂算法之所以时间复杂度非常高(为O(指数n)),就是因为当指数n非常大的时候,需要执行的循环操作次数也非常大.所以我们快速幂算法的核心 ...
- 快速幂算法c语言求a的n次方,快速幂运算模板(求n^k以及前几位或后几位)
计算n^k的结果 步骤: 1.把n由十进制转换为二进制,按二进制来计算(最后结果还是一样的) 2.把n由二进制转换为2^k相加的形式 先举个例子: 求5^22: 接着就可以很好地理解了 O(logn) ...
- C语言判断一个数是否是质数(蒙格马利快速幂算法)
前言: 今天搞了一天这个 蒙格马利 什么的,我自己肯定是搞不定,参照了很多资料,写一下自己的理解总结,防止忘了没地方看. 只是我个人的理解,对不对还得另说,一些公式还是不懂,只是大概的理解了下,各位当 ...
- 快速幂算法相关题目(Leetcode题解-Python语言)
50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...
- 【算法分析与设计】快速幂算法与快速幂取模算法
文章目录 快速幂算法 算法分析 算法实现 位运算优化 BigInteger支持 快速幂取模算法 算法优点 算法推导 算法实现 BigInteger支持 本文完整代码实现(Java语言描述) 快速幂算法 ...
- 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...
- 【复习】快速幂算法详解
快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O(n)转化为O(logn)的算法 他的原理就是: 252^525 = 2∗2∗2 ...
- java位运算求幂,程序员必学:快速幂算法
前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...
- python快速幂算法解决大数取模
1.前置性质 模运算的性质 [(a mod n)×(b mod n)] mod n = (a×b) mod n 指数可以拆分成二进制的形式,如9拆分成 1001 根据二进制的计算,1001 = ((1 ...
最新文章
- Scala’s parallel collections
- R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义函数在三线表中添加p值
- iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置
- 【小技巧】Xcode7.1中KSImageNamed无效的解决方法
- 17-比赛1 A - Weak in the Middle (栈)
- HarmonyOS之跨设备分布式应用调试
- 一文读懂 HMM 模型和 Viterbi 算法
- 数据结构 二叉树的存储结构_线程二叉树| 数据结构
- 用友财务软件主要数据表字段含义
- 如何销毁一个实例化对象_JAVA中如何创建和销毁对象
- 深入理解并发的关键字-volatile
- Windows10安装redis(图文教程)
- http get post java_Java发送http的get、post请求 - 穿梭于偶然
- OFFICE2003的自动保存功能。
- 决策树-Cart算法二
- Java内存模型JMM
- 魏俊妮《如何成为支持业务的HR》课程大纲
- dw怎么保存html格式,教你如何用Dreamweaver制作网页以及保存网页的方法--系统之家...
- 共享店铺靠谱么?共享店铺哪家好?全方位测评企雀共享店铺,黑谷共享店铺!
- 注意,金士顿Kingston KHX-FAN内存散热器,接口是小3pin母头。
热门文章
- 新疆计算机考试ppt教程,职考宝典2021新疆 职称计算机考试模块ppt2007真题试题软件...
- matlab导入桌面excel数据库,matlab导入excel数据_excel怎么导入网络上的数据?_excel导入网络数据...
- 【独家】彩虹代shua最新6.6版本/免授权/后台同步官方版本升级
- 顺序表(Seqlist)链表(List)的基础操作
- 性能测试跑分软件,AE Benchmark(AE性能测试跑分工具) V1.0 免费版
- MongoDB--- 客户端操作 与 复制集
- 菜鸟驿站巴枪APP下载
- python qt gui教程_Python GUI教程(四):安装并使用Qt设计师设计Python GUI
- mybatis第三话 - mybatis的高端用法你会吗?
- pascal和C++的相同/不同