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

以下以求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开发如何定制framework层服务

    刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...

  2. 购物车redis存储结构

  3. spring boot(7)-mybatis全注解化

    关于配置数据库可以参考上一篇文章,这里只讲mybatis pom.xml <!-- 引入mybatis --> <dependency> <groupId>org. ...

  4. pmp证书

  5. MVC框架以及实例

    MVC框架 MVC(model,view,controller),一种将业务逻辑.数据.界面分离的方法组织代码的框架.在改进界面及用户交互的同时,不需要重写业务逻辑.MVC将传统的输入.处理和输出分离 ...

  6. Python logger模块

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  7. Azure 登录设置

    转自 http://blog.csdn.net/azure_nonofficial/article/details/38095459 这是我们Azure非官方的第一篇博文,欢迎大家各种拍砖. 微软云计 ...

  8. Voronoi图及matlab实现

    [题外话:想一想真是...美赛时我预测求爱尔兰的充电站位置分布,画Voronoi图,程序跑了一个小时...]   Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂 ...

  9. BZOJ 1588 营业额统计 set

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1588 题目大意: 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交 ...

  10. java list.remove移除失败

    1. resultList.remove(i) 移除失败说明 当i为Integer类型时,通过观察源码发现当找不到该类型时就会自动去找Object类型,即remove(object),因为集合中不存在 ...