模板 快速幂取模

【模板】快速幂取模

 1 long long quickmod(long long a,long long b,long long m)
 2 {
 3     long long ans = 1;
 4     while(b)//用一个循环从右到左便利b的所有二进制位
 5     {
 6         if(b&1)//判断此时b[i]的二进制位是否为1
 7         {
 8             ans = (ans*a)%m;//乘到结果上,这里a是a^(2^i)%m
 9             b--;//把该为变0
10         }
11         b/=2;
12         a = a*a%m;
13     }
14
15     return ans;
16
17 }
时间: 2024-10-10 09:32:42

模板 快速幂取模的相关文章

【模板】快速幂取模

快速幂取模的模板,要注意所有变量都要开成long long类型的防溢出: #include<cstdio> #include<algorithm> #include<cstring> typedef long long LL; const LL mod=1e9+7; using namespace std; LL a,b; LL mi(LL x,LL y) { LL res=1; while(y){ if(y&1) res=res*x%mod; y>>

快速幂取模算法【模板】

快速幂取模其实是a^b%c,这就是著名的RSA公钥加密的方法,当a,b都很大的时候,直接求是不可取的,所以就用到了快速幂取模. 首先你得明白他的原理,其实是用到了二分的思想,把b按照二进制展开 b = p(n)*2^n  +  p(n-1)*2^(n-1)  +-+   p(1)*2  +  p(0).其中p(i) (0<=i<=n)为 0 或 1. 所以此时a^b =  a^ (p(n)*2^n  +  p(n-1)*2^(n-1)  +...+  p(1)*2  +  p(0))=  a^

快速幂取模和快乘取模

一.快速幂取模概念 快速幂取模,顾名思义,就是快速的求一个幂式的模(余),比如a^b%c,快速的计算出这个式子的值. 在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法. 二.快速幂取模算法实现 1)很容易能想到,循环b次,每次乘a,最后对c取余就可以了. int ans = 1; for(int i = 1; i<=b; i++) { ans = ans * a; } ans = ans % c; 这个朴素算法的问题是: 1.如果a和b

快速幂取模总结

大白书上说的是模运算..而且给出了递归版的代码..我觉得还是非递归的好..而且加上了位运算,速度更快.下面是快速幂取模模板. 模板: LL quickpow(LL n, LL m, int mod) { LL ans=1; while(m>0) { if(m&1) ans=ans*n%mod; m=m >> 1; n=n*n%mod; } return ans; } 练习题目: HDU 1061 hdu 2035 快速幂取模总结

POJ 3233-Matrix Power Series( S = A + A^2 + A^3 + … + A^k 矩阵快速幂取模)

Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20309   Accepted: 8524 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one test cas

快速幂取模(POJ 1995)

http://poj.org/problem?id=1995 以这道题来分析一下快速幂取模 a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 利用公式a*b%c=((a%c)*b)%c 每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化 由此可以用快速幂算法优化: http://www.cnblogs.com/qlky/p/5020402.html 再结合取模公式: (a + b) % p = (a % p

快速幂及快速幂取模

快速幂顾名思义,就是快速算某个数的多少次幂.其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高.——bybaidu 快速幂可以用位运算这个强大的工具实现. 代码: 1 int pow(int a,int b) 2 { 3 int ans=1; 4 while(b!=0) 5 { 6 if(b&1) 7 ans*=a; 8 a*=a; 9 b>>=1; 10 } 11 return ans; 12 } 快速幂取模需要记住一个定理:积的取模等于取模积的取模:算法是蒙

关于快速幂取模

今天看算法书的时候,看到一道关于快速幂取模的题,心想好像不难,便写了一下,发现我的渣渣代码写的比正常的O(N)复杂度还要慢(天知道我怎么做到的T_T),渣渣代码如下: 1 public static long fastMi(long x,long n){ 2 if(n==1){ 3 return x; 4 } 5 if(n%2==0){ 6 return fastMi(x,n/2)*fastMi(x,n/2); 7 }else{ 8 return fastMi(x,n/2)*fastMi(x,n

快速幂取模算法

什么是快速幂? 快速幂应当是快速幂取模的简称 对于一般的求幂算法,求$a^b\,\bmod\,m$,即使用循环b次的方法,复杂度是$O(b)$的,当b很大的时候,这种算法就会显得十分缓慢. 快速幂是基于以下明显的事实: $${a^b} \equiv {(a^2)^{\frac{b}{2}}} \pmod{m}\quad b\ is\ even$$ $${a^b} \equiv {(a^2)^{\frac{b}{2}}*a} \pmod{m}\quad b\ is\ odd$$ 那么我们得到这样一