今天分享下各种快速幂(有点坑),首先说一下快速幂的原理,

以下以求a的b次方来介绍 [1] 
把b转换成二进制数
该二进制数第i位的权为

 
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算

 
第一种方法(普通的快速幂)   
#include<iostream> //适用范围a,b,p 1e9
#include<cmath>
#include<algorithm>
#include<stack>
#include<map>
using namespace std;
typedef long long ll; ll fastpower(ll a,ll b,ll p) //写一个快速幂的函数
{
ll ans = 1;
while(b) //b的二进制还有位数
{
if(b & 1) //b为奇数 循环
{
ans = ans * a % p;
}
a = a * a % p; // 2^n 增长
b >>= 1; // b右移一位
}
return ans % p; //防止b为0,而没有模 p
} int main()
{
ll a,b,p;
cin>>a>>b>>p;
cout<<fastpower(a,b,p)<<endl;
return 0;
}
第二种方法(第一种的强化版)
#include <stdio.h> //无敌的_int 128 可以无视a,b,p的范围,这范围真的恶心 a,b,p 1e18
typedef __int128 ll;
longlong a_b_Mod_c(ll a, ll b, ll p)
{
ll s = ;
while (b)
{
if (b & )
s = (s * a) % p;
a = (a * a) % p;
b >>= ;
}
return (longlong) s % p;
}
int main()
{
int t;
longlong a, b, p;
scanf("%d", &t);
while (t--)
{
scanf("%lld%lld%lld", &a, &b, &p);
printf("%lld\n", a_b_Mod_c(a, b, p));
}
return;
}
第三种方法(普通快速幂的优化,即也用了快速乘)
#include <iostream>
using namespace std; typedef long long ll; ll q_mul(ll a, ll b, ll mod) //快乘
{
ll ans=0;
while(b)
{
if(b & 1) ans=(ans+a)%mod;
a=(a<<1)%mod;
b>>=1;
}
return ans;
} ll q_pow(ll a, ll b, ll mod) //快幂
{
ll ans=1;
while(b)
{
if(b & 1) ans=q_mul(ans,a,mod);
a=q_mul(a,a,mod);
b>>=1;
}
return ans;
} int main()
{
ll a,b,mod;
int n;
cin>>n;
while(n--)
{
cin>>a>>b>>mod;
cout<<q_pow(a,b,mod)<<endl;
} }
Java代码
import java.math.BigInteger;
import java.util.Scanner; public class Main{ public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++)
{ BigInteger A = sc.nextBigInteger();
BigInteger B = sc.nextBigInteger();
BigInteger P = sc.nextBigInteger();
System.out.println(A.modPow(B, P));
}
} }
最后的大招-python(变态,一般做大数的都用它,别问我为什么,
一时用python一时爽,一直用python一直爽,貌似是py的整数类的封装问题)
python 1,def fastExpMod(b, e, m):
result = 1
while e != 0:
if (e&1) == 1:
# ei = 1, then mul
result = (result * b) % m
e >>= 1
# b, b^2, b^4, b^8, ... , b^(2^n)
b = (b*b) % m
return result
t=int(input())
while t:
t-=1
a, b, c = map(int, input().split())
print(fastExpMod(a,b,c)) 2,n = int(input())
for i in range(n):
a, b, p = map(int, input().split())
print(pow(a, b, p))
如果有错误的地方恳请大家指出来。
1≤T≤1031≤T≤103,1≤A,B,P≤1018

各种快速幂(qaq)的更多相关文章

  1. 多项式求ln,求exp,开方,快速幂 学习总结

    按理说Po姐姐三月份来讲课的时候我就应该学了 但是当时觉得比较难加上自己比较懒,所以就QAQ了 现在不得不重新弄一遍了 首先说多项式求ln 设G(x)=lnF(x) 我们两边求导可以得到G'(x)=F ...

  2. HDU 5607 graph 矩阵快速幂 + 快速幂

    这道题得到了学长的助攻,其实就是一个马尔科夫链,算出一步转移矩阵进行矩阵快速幂就行了,无奈手残 这是我第一回写矩阵快速幂,写的各种毛病,等到调完了已经8点44了,交了一发,返回PE,(发现是少了换行) ...

  3. 快速幂:quickpow

    众所周知,快速幂是优化对数的次方运算的最普遍手段.在学习快速幂的思想时,其分治思想容易让大家用简单的递归实现. 但其实,除了递归之外,更好的方法会是简单的 WHILE循环.下面贴代码: #includ ...

  4. 关于矩阵快速幂的用法总结QwQ

    umm首先矩阵快速幂的板子就不港了比较简单的还是?就结合二进制地理解一下就好了,代码可以翻蒟蒻の考前续命这里面放了我记得? 主要是说下应用趴? 目前我会的似乎就是个矩阵加速?简单来说就是个给一个递推式 ...

  5. 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解

    矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...

  6. 【11.1校内测试】【快速幂DP】【带权并查集】【模拟】

    Solution $jzy$大佬用了给的原根的信息,加上矩阵快速幂150行QAQ 然而$yuli$大佬的做法不仅好懂,代码只有50行! 快速幂的思想,把m看成要组成的区间总长度,每次将两段组合得到新的 ...

  7. 【矩阵快速幂】【杭电OJ1757】

    http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (Java/ ...

  8. CSUOJ 1162 Balls in the Boxes 快速幂

    Description Mr. Mindless has many balls and many boxes,he wants to put all the balls into some of th ...

  9. 51nod 1197 字符串的数量 V2(矩阵快速幂+数论?)

    接上一篇,那个递推式显然可以用矩阵快速幂优化...自己随便YY了下就出来了,学了一下怎么用LaTeX画公式,LaTeX真是个好东西!嘿嘿嘿 如上图.(刚画错了一发...已更新 然后就可以过V2了 or ...

随机推荐

  1. 远程桌面到 Ubuntu 虚拟机

    安装 Ubuntu 虚拟机,创建端口号为 3389 的 Endpoint. 安装 Gnome 桌面 复制 sudo apt-get update sudo apt-get install ubuntu ...

  2. Google Developers 中国网站正式发布

    Google Developers 中国网站 (developers.google.cn) 正式发布!Google Developers 中国网站是特别为中国开发者而建立的,它汇集了 Google 为 ...

  3. 深入理解C++中的初始化

    C++经过这么多年的发展,已然成了一种文化和艺术,而这种艺术和文化并不是C++所固有的,是C++在各个方面的应用的总结和艺术化的结果.C++看起来比较复杂,但是深入其中你会发现C++是那么优美而富有哲 ...

  4. 关于webWorker的理解和简单例子

    一.理解 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能.您可以继续做任何愿 ...

  5. 关于Unity3d的世界空间和本地空间的一点思考

    最近才开始学Unity3d,被这个本地空间和世界空间搞得有点晕头转向的.于是花了一点时间随便写了一点代码加深理解.代码如下: public class MoveX : MonoBehaviour { ...

  6. SQLyog通过ssh隧道连接MySQL

    1.简介 因为现在很多公司服务的数据库为了安全起见,都不允许直接连接其服务,而只能通过跳板机进行登陆到数据库.而ssh有一项非常有用的功能,即端口转发的隧道功能,让一些不安全的服务,像TCP.POP3 ...

  7. Python学习---JSONP学习180130

    同源策略机制      同源:协议://IP:端口[协议,域名,端口相同]      跨域:知道对方接口,同时对方返回的数据也必须是Jsonp格式的 问题描述:Ajax跨域请求数据的时候,实际浏览器已 ...

  8. VS无法加载Web项目

    在VS中修改Web项目的服务器设置时无法加载改Web项目,提示如下图 原因:因为项目中的EbcBuy.Bll.Users.WebApi.csproj.user文件并没有加入到版本控制文件,所以讲项目还 ...

  9. 更改mysql数据存储路径

    1.检查mysql数据库存放目录 mysql -u root -prootadmin show variables like '%dir%'; quit; (查看datadir 那一行所指的路径) 2 ...

  10. IntelliJ IDEA 下载和激活

    IntelliJ IDEA 下载地址: https://www.jetbrains.com/idea/download/#section=windows 激活码获取地址:http://idea.lan ...