快速幂的求法之总结.

刚刚接触到ACM 遇到指数实在是有心无力,在网上查了一下.发现了快速幂.现总结如下:

我称为quick mi.

假设3个数字 a,b,c;

我要求的是 (a^b)modc=?

显然,如果a b 都过大的话,数据肯定会溢出的. 所以

用quick mi肯定简单许多,时间缩短了,而且也不容易溢出.

首先想到一个公式:(a*b)modc = (amodc)*(bmodc)modc;

这个公式怎么来的,证明过程如下:

amodc=d;

bmodc=e;

a=tc+d;

b=kc+e;

所以 (a*b)modc=(...)(...)modc=(tkc^2+(te+ak)c+de)modc=demodc=(amodc)(bmodc)modc;

依上公式可得:

假设b为偶数 即得 ((a^2)^(b/2))mod c 然后设a=a^2 得 (a^(b/2))modc 又令 a=a^2;得 (m^(b/4))modc;

但是 在此过程中,很有可能会使得b的值为奇数,那么,只要在加一句判断 然后 s=(s*a)%c;s为之前求得的余数。//即多乘一项即可!

代码如下:

 1 int quickmi(int a,int b,int c)
 2 {   int s=1;
 3     a=a%c;
 4     while(b>0)
 5     {
 6         if(b%2==1)//判断一下b是否为奇数
 7           s=(s*a)%c;//如果是奇数,则多乘一项
 8           b=b/2;
 9           a=(a*a)%c;
10     }
11     return s;
12 }
时间: 2025-01-04 15:41:04

快速幂的求法之总结.的相关文章

菲波那契数列的快速幂矩阵求法

时间:2014.05.15 地点:基地二楼 ----------------------------------------------------------------------- 一.背景 著名的斐波那契数列为一个这样的序列:0 1 1 2 3 5 8 13 21 34......简单的递推公式如下: F(0)=0,F(1)=1,当n>=1时,F(n)=F(n-1)+F(n-2) 显然,我们用直接的按公式递归的算法去计算该数列的第n项效率并不高,因为这样每次递归调用我们只是将规规模缩小了

快速幂讲解

快速幂这个东西比较好理解,但实现起来到不老好办,记了几次老是忘,今天把它系统的总结一下防止忘记. 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多.它的原理如下: 假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为,例如当b==11时 11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 ,

【转载】快速幂讲解

转载自:cxcxcxc 快速幂讲解 快速幂这个东西比较好理解,但实现起来到不老好办,记了几次老是忘,今天把它系统的总结一下防止忘记. 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多.它的原理如下: 假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时   a^11=a^(2^0+2^1+2^3) 11的二进制是101

数据结构15——快速幂

一.相关介绍 快速幂 做到快速求幂 时间复杂度:O(logn) 问题引入 题目:求ab 朴素解法:将a连乘b次,那么对应的时间复杂度就是O(b),即O(n). 快速幂法:关于此题的快速幂法会在下面的算法实现提及. 二.算法实现 下面以求ab的过程为例讲解快速幂的实现: b可以转换为二进制数,该二进制数第i位的位权为2i-1 例如,当b==11时,a11=a2^0+2^1+2^3,11的二进制是1011,11 = 23×1 + 22×0 + 21×1 + 20×1,因此,我们将a11转化为算 a(

矩阵快速幂优化递推总结

RT,主要总结一下矩阵的求法. 首先能用矩阵快速幂优化的递推类型是f[n]=5f[n-3]+6f[n-2]+2f[n-1]+n^2+n+8之类的 也就是说递推是线性递推且f[n-i]前面的系数是常数,可以含有与n有关的多项式,也可以含有常数的这种递推,下面总结一下矩阵的写法: 先考虑最简单的常数,我们其实可以忽略常数,因为顶多在没有常数的矩阵外面加一行一列就行了 以f[n]=2f[n-1]+6f[n-2]+5f[n-3]+n^2+n为例 先写迭代的矩阵,一般可以写成一行,右边有几项写几项 {f[

POJ 3070 Fibonacci(矩阵快速幂模板)

Description: In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … An alternative formula for the Fibonacci sequence i

SHUOJ1857 Yaoge鸡排系列之九——好多鸡排!!!【矩阵快速幂】

转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1857 1857: Yaoge鸡排系列之九——好多鸡排!!! Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 98  Solved: 6 Description Yaoge买了n块鸡排,其中第n块鸡排的质量为M(n),同时

Codevs1732-矩阵乘法快速幂

Codevs1732,这道题要求求fibonacci数列的第N项,1 <= n <= 100000000000000,非常大,普通的O(N)的求法肯定会TLE,所以我们需要用的快速幂矩阵乘法,在O(logN)的时间内即可求出.矩阵的乘法是这样的:我们定义X(i,j)表示矩阵第i行第j列的元素.我们定义两个矩阵A和B,A有n行m列,B有m行p列,则此时矩阵A和B的乘法有定义(当且仅当A的列数=B的行数时,A*B有定义):A*B=C,矩阵C为n行p列 ,C(i,j)=Σ(A(i,k)*B(k,j)

【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂

[BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列.但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个.小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi.另外,小C认为这个问题的答案可能