ACM数论-快速幂
ACM数论——快速幂
快速幂定义:
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
原理:
以下以求a的b次方来介绍:



快速幂位运算:
- LL pow_mod(LL a, LL b, LL p){//a的b次方取余p
- LL ret = ;
- while(b){
- if(b & ) ret = (ret * a) % p;
- a = (a * a) % p;
- b >>= ;
- }
- return ret;
- }
快速乘:
为了防止求的时候溢出,通常会使用一种叫做“快速乘”的算法。
- LL mul(LL a, LL b, LL p){//快速乘,计算a*b%p
- LL ret = ;
- while(b){
- if(b & ) ret = (ret + a) % p;
- a = (a + a) % p;
- b >>= ;
- }
- return ret;
- }
具体拿一个题目来示例,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5187
这个题先找规律,然后在求快速乘法和快速幂结合起来。题目推出来通式是:2n-2
- #include<iostream>
- #include <cstdio>
- using namespace std;
- typedef long long LL;
- LL fast_multi(LL m, LL n, LL mod)//快速乘法
- {
- LL ans = ;//注意初始化是0,不是1
- while (n)
- {
- if (n & )
- ans += m;
- m = (m + m) % mod;//和快速幂一样,只不过这里是加
- m %= mod;//取模,不要超出范围
- ans %= mod;
- n >>= ;
- }
- return ans;
- }
- LL fast_pow(LL a, LL n, LL mod)//快速幂
- {
- LL ans = ;
- while (n)
- {
- if (n & )
- ans = fast_multi(ans, a, mod);//不能直接乘
- a = fast_multi(a, a, mod);
- ans %= mod;
- a %= mod;
- n >>= ;
- }
- return ans;
- }
- int main()
- {
- LL n, p;
- while (~scanf("%I64d %I64d", &n, &p))
- {
- if (n == )//特判一下
- {
- printf("%I64d\n", % p);
- continue;
- }
- printf("%I64d\n", (fast_pow(, n, p) - + p) % p);//这一步注意,不要为负数
- }
- return ;
- }
ACM数论-快速幂的更多相关文章
- BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演
原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...
- HDU 5451 Best Solver 数论 快速幂 2015沈阳icpc
Best Solver Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Tota ...
- BZOJ-1008 越狱 数论快速幂
1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 6192 Solved: 2636 [Submit][Status] ...
- hdu-5698 瞬间移动(数论+快速幂)
题目链接: 瞬间移动 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝 ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- poj1845 数论 快速幂
Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16466 Accepted: 4101 Descripti ...
- ACM | 算法 | 快速幂
目录 快速幂 快速幂取模 矩阵快速幂 矩阵快速幂取模 HDU1005练习 快速幂 幂运算:\(x ^ n\) 根据其一般定义我们可以简单实现其非负整数情况下的函数 定义法: int Pow ( ...
- POJ 3641 Pseudoprime numbers (数论+快速幂)
题目链接:POJ 3641 Description Fermat's theorem states that for any prime number p and for any integer a ...
- BZOJ3560 DZY Loves Math V 数论 快速幂
原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html UPD(2018-03-26):蒟蒻回来重新学数论了.更新了题解和代码.之前的怼到后面去了 ...
随机推荐
- ACM HDU 1755 -- A Number Puzzle
A Number Puzzle Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- IIS7.5使用web.config设置伪静态的方法
IIS 7和IIS 7.5及以后的版本估计都会使用web.config来实现伪静态规则,于是我们以前的伪静态文件必须更改.网上找了一圈,还没有发现比较全面的web.config伪静态规则,于是我们这里 ...
- php安装扩展redis淌过的坑
php安装扩展redis淌过的坑 php扩展 redis cd /usr/local/src/ wget https://github.com/nicolasff/phpredis/archive/2 ...
- Oracle Update语句
Oracle没有update from语法,可以通过四种写法实现同样的功能: 一.标准update语法(常用.速度可能最慢) 当更新的表示单个或者被更新的字段不需要关联表带过来,此法是最好的选择. u ...
- php生成csv文件并提供下载及相关注意事项
1.生成文件过程略,只要逗号分割就可以了 2.提供下载加上如下代码: header("Content-type: application/octet-stream"); heade ...
- hdu 6208 The Dominator of Strings【AC自动机】
hdu 6208 The Dominator of Strings[AC自动机] 求一个串包含其他所有串,找出最长串去匹配即可,但是匹配时要对走过的结点标记,不然T死QAQ,,扎心了.. #inclu ...
- WAS8.5安装和部署
刚研究WAS8.5的安装部署,写一些注意事项: 1.下载安装软件 安装器:agent.installer.linux.gtk.x86_64_1.7.2000.20140227_0303 WAS: WA ...
- 简要总结 数据仓库VS数据库
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wl101yjx/article/details/31015367 本文简要总结以下两个问题,旨在高速 ...
- ASP.NET Web API编程——构建api帮助文档
1 概要 创建ASP.NET Web Api 时模板自带Help Pages框架. 2 问题 1)使用VS创建Web Api项目时,模板将Help Pages框架自动集成到其中,使得Web Api项目 ...
- ASP.NET Web API编程——异常捕获
1 向客户端发送错误消息 使用throw new HttpResponseException()向客户端抛出错误信息. HttpResponseException包含两个重载的构造函数,其中一个是构造 ...