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

以下以求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. (WCF) 利用WCF实现两个Process之间的通讯。

    目的: 实现两个独立的Process 之间的通讯. 实现思路: 建立一个WCF Service,然后将其Host到一个Console 程序中,然后在另外一个Console程序中引用WCF的Servic ...

  2. VC学习笔记---ATL MFC CLR三个库的区别

    MFC.ATL和CLR是VC2005内置的三大库,涵盖了Windows的各种开发方法和开发应用.当然关于C++开发的库不止这三个,不过这三个是微软推荐. 从编程所处层次而言,WIN32为最底层,其次是 ...

  3. Android GridView异步加载图片和加载大量图片时出现Out Of Memory问题

    我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application No R ...

  4. 【转】pscp实现远程文件(夹)传输

    原文地址:http://blog.163.com/yang_jianli/blog/static/16199000620128251383197/ pscp与linux下的scp命令相似,功能相同,在 ...

  5. 常用sql commands以及mysql问题解决日志

    mysql workbench常用命令快捷键 ctrl+T ->创建新的sql query tab ctrl+shift+enter->执行当前的sql命令 https://dev.mys ...

  6. 如何检索某个字段在sqlserver中的哪个些存储过程中?很简单的SQL语句。

    SELECT obj.Name 存储过程名, sc.TEXT 存储过程内容 FROM syscomments sc INNER JOIN sysobjects obj ON sc.Id = obj.I ...

  7. 关于hashcode 里面 使用31 系数的问题

    首先我们来了解一下hashcode,什么是hashcode?有什么作用? hashcode其实就是散列码,使用hashcode使用高效率的哈希算法来定位查找对象! 我们在使用容器来存储数据的时候会计算 ...

  8. Linux 系统安装[Redhat]2

    1.1. 配置网络 开机启动网卡eth0 1. 修改网络信息[root@Webserver ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVI ...

  9. hmac 算法模块

    Hmac算法:Keyed-Hashing for Message Authentication.它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中 Python自带的hmac模块实现了标准 ...

  10. 如何解决ORA-12547错误!

    最近在布置一个应用程序连接oracle后台数据库,数据库为oracle11g(11.2.0.2).应用程序属于root用户,所以需要以root用户通过系统认证的方式连接数据库.设置了root用户的环境 ...