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

以下以求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. Android学习笔记(4)----Rendering Problems(The graphics preview in the layout editor may not be accurate)

    在Android Studio中新建了一个 setting.xml 文件,布局好文件后,从 Text 界面切换到 Design 界面,显示了如下错误: 网上搜寻 The graphics previe ...

  2. Android学习笔记(2)----LocationManager的使用

    今天使用Android的LocationManager制作了一款获取当前经纬坐标位置的软件. LocationManager获取的只是经纬坐标点,为了解析出当前经纬坐标点的实际位置,可以使用Googl ...

  3. Linux时间同步+国内常用的NTP服务器地址

    当Linux服务需要时间戳的时候,时间同步就显得十分重要.这里介绍下,最近我使用的一个同步命令. # ntpdate s1a.time.edu.cn 国内常用的NTP地址 210.72.145.44 ...

  4. mac下 安装tomcat 后项目无法启动以及 错误 找不到或无法加载主类

    按照网上的步骤,在mac上安装tomcat后,写个简单的测试类报错:错误 找不到或无法加载主类 Class JavaLaunchHelper is implemented in both /Libra ...

  5. MessageFormat使用记录

    1.日志里面需要记录入参,之前一般使用StringUtils.formt()方法,但是如果入参含有空值,就会报错.这个时候可以使用MessageFormat方法.用法 format(String pa ...

  6. MYSQL LOGBIN 数据日志恢复数据库随笔

    查看指定的二进制日志中的事件(MYSQL命令行) mysql> show binlog events in 'binlogfullpath'; 查看二进制日志中的事件(MYSQL命令行) mys ...

  7. 毕向东_Java基础视频教程第20天_IO流(1~4)

    第20天-01-IO流(File概述) File类: 用来将文件或者文件夹封装成对象, 方便进行操作. File对象可以作为参数, 传递给流对象的构造函数. 流对象不能操作文件夹; 流对象不能操作文件 ...

  8. leetcode Ch3-DFS & Backtracking I

    一.树的遍历 [非递归版] 1. 后序 class Solution { public: vector<int> postorderTraversal(TreeNode *root) { ...

  9. Docker相关连接

    docker-compose文档:https://docs.docker.com/compose/compose-file/ dockerfile文档:https://docs.docker.com/ ...

  10. Effective C++(20) 继承与面向对象设计

    本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure ...