倍增法&快速幂思想在解题中的应用

1.(a^b)mod p POJ 1995 快速幂板子题

(附带板子)

typedef long long ll;

ll mod;

ll qp(ll a,ll b)

{

  ll ret=1,base=a;

  while(b)

  {

    if(b&1)

      ret=(ret*base)%mod;

    base=(base*base)%mod;

    b=b>>1;

  }

  return ret;

}

2.求(a*b)mod p;  (a,b为longlong 64位整数乘法)

设b的二进制表示为b=Ck*2^k+Ck-1*2^k-1+.....+C0*2^0. 其中Ci∈{0,1};

那么a*b=a*(∑i=0->k Ci*2^i)=∑(i=0 to k) (a*2^i)*Ci;

由于a*2^i=(a*2^i-1)*2,而Ci可以由b&1导出,可以进行推导。

原文地址:https://www.cnblogs.com/little-cute-hjr/p/12289138.html

时间: 2024-10-09 21:53:32

倍增法&快速幂思想在解题中的应用的相关文章

Codeforces Round #518 (Div. 1) Computer Game 倍增+矩阵快速幂

接近于死亡的选手没有水平更博客,所以现在每五个月更一篇. 这道题呢,首先如果已经有权限升级了,那么后面肯定全部选的是 \(p_ib_i\) 最高的. 设这个值为 \(M=\max \limits_i p_ib_i\). 主要的问题在于前面怎么选. 假设剩下的时间还有 \(t\) 秒.那么我们很容易得到一个这样的式子. \[ dp[t+1] = \max_i \{p_i \cdot (a_i+tM) + (1-p_i) \cdot dp[t]\} \] 把 \(\max\)里面的内容整理一下. \

Tr A(矩阵快速幂)

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3175    Accepted Submission(s): 2373 Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据.每组数据的第一行有n(2 <=

快速幂矩阵

整数快速幂: 为了引出矩阵的快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂. 如果现在要算X^8:则 XXXXXXXX 按照寻常思路,一个一个往上面乘,则乘法运算进行7次. (XX)(XX)(XX)(XX) 这种求法,先进行乘法得X^2,然后对X^2再执行三次乘法,这样去计算,则乘法运算执行4次.已经比七次要少.所以为了快速算的整数幂,就会考虑这种结合的思想. 现在要考虑应该怎么分让计算比较快.接下来计算整数快速幂.例如:X^19次方. 19的二进制为:1 0 0 1 1 . 由(X^m

快速幂&amp;快速乘法

尽管快速幂与快速乘法好像扯不上什么关系,但是东西不是很多,就一起整理到这里吧 快速幂思想就是将ax看作x个a相乘,用now记录当前答案,然后将指数每次除以2,然后将当前答案平方,如果x的2进制最后一位为1的话,就将答案乘以现在的数.快速乘法类似,只是将a*x看作x个a相加. 代码 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int mi(int a,int x) 5 { 6 int ans=1;

UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)

题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))(A + A^2 + A^3 + ... + A^(m/2)),然后依次计算下去,就可以分解,logn的复杂度分解,注意要分奇偶. 另一种是直接构造矩阵,,然后就可以用辞阵快速幂计算了,注意要用分块矩阵的乘法. 代码如下: 倍增法: #pragma comment(linker, "/STACK:10

poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout

BestCoder Round #29——A--GTY&#39;s math problem(快速幂(对数法))、B--GTY&#39;s birthday gift(矩阵快速幂)

GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description GTY is a GodBull who will get an Au in NOI . To have more time to learn alg

sdut2605 A^X mod P 山东省第四届ACM省赛(打表,快速幂模思想,哈希)

本文出自:http://blog.csdn.net/svitter 题意: f(x) = K, x = 1 f(x) = (a*f(x-1) + b)%m , x > 1 求出( A^(f(1)) + A^(f(2)) + A^(f(3)) + ...... + A^(f(n)) ) modular P. 1 <= n <= 10^6 0 <= A, K, a, b <= 10^9 1 <= m, P <= 10^9 本题目的关键在于大幂的分解和..你要这样想,因

快速幂的思想

预备知识: a*b%p=((a%p)*b)%p (a+b)%p=(a%p+b)%p 快速幂就是快速求一个数的幂 两个整数a,b,求a^b 把b分解成几个2的次方的和,然后就相当于做一个指数乘法 比如说2^11 11=2^3+2^1+2^0 ans=2^(2^3+2^1+2^0)=2^(2^3)*2^(*2^1)+2^(2^0) 代码: long long ksm(long  long a,long long  b){ long long ans=1; while(b){ if(b&1==1)