1. 程式人生 > >高次冪取模 (快速冪取模)

高次冪取模 (快速冪取模)


來自百度文庫 PPT作者 張鵬

只能說下載分數太貴了。。

基本概念及思想

¡對形如a^b mod m 的運算(b一般較大) ¡但a,b,m都在long型範圍內 ¡演算法的主要思想是分治,分而治之。將大的問題分成若干個相似的較小的問題! ¡具體實現是用遞迴的方法! 舉例
¡2^100mod 3 ¡像這種運算如果先算出2^100 的值,然後再模上3,相信比較困難! ¡我們可以將100變小點 ¡2^100=(2^50)^2 =((2^25)^2)^2=((((2^1)^2)^2)…)^2 ¡若我們已經得出250 mod 3的值,我們便很簡單地得出2^100mod 3的值。
¡按照上述的方法繼續分下去… ¡最終肯定會得到2^1mod 3 這種情況!這樣就好辦了!這便是遞迴的邊界,到此我們就可以返回2 mod 3的值了! ¡另一個問題,再分時有兩種情況! ¡2^100=(2^50)2        , 100是偶數 ¡2^99=(2^49)2 *2   , 99是奇數 ¡第二種情況需要在第一種情況上乘上一次基數。
主要程式碼
long mod(long a,long b,long m)
{   
    if(!b) return 1;                //邊界處理
    if(b==1) return a%m;     //邊界處理
    long ans=mod(a,b/2,m); //進入下一層
    ans=ans*ans%m;     //返回值ans代表ab/2
    if(b&1) ans=ans*a%m; //奇數情況處理
    return ans;             //返回ans代表abmodm
}

呼叫
¡上述函式是有三個引數,且有返回值! ¡它的功能是計算ab mod m的值! ¡如何在主函式裡呼叫呢? ¡例如我們要計算2^100mod3的結果!我們可以首先定義一個變數ans,在主函式讀入工作完成後,我們可以寫ans=mod(2,100,3); ¡ans 裡的數值便是2^100mod3的結果了。 遞推法
¡用遞推法首先要將b轉換為二進位制數,(b)10=(b)2。 ¡舉例:(45)10=(101101)2 ¡545mod 3 =2 ¡二進位制數由0和1組成,它們分別代表著偶數和奇數。 ¡遞推時在0和1處的處理是有差別的。
參考程式碼
¡二進位制轉換: ¡long s=0; ¡while(b>0) ¡{ ¡    t[++s] = b%2; ¡    b/=2; ¡} ¡遞推過程: ¡long ans=1; ¡for(i=1;i<=s;i++) ¡if(t[i]) ¡  ans=ans*ans*a%m; ¡else ¡  ans=ans*ans%m; ---------------------------------------------------------------- 本人補充: 附上一段高質量程式碼:
int modular_exponent(INT a,INT b,INT n){
 int ret=1;
 for (;b;b>>=1,a=a*a%n)
  if (b&1)
   ret=ret*a%n;
 return ret;
}

 


相關推薦

(快速)

來自百度文庫 PPT作者 張鵬 只能說下載分數太貴了。。 基本概念及思想 ¡對形如a^b mod m 的運算(b一般較大) ¡但a,b,m都在long型範圍內 ¡演算法的主要思想是分治,分而治之。將大的問題分成若干個相似的較小的問題! ¡具體實現是用遞迴的方法! 舉例

51nod 1013 3的的和(除法+快速

基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級演算法題  收藏  關注  取消關注 求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 Input 輸入一個數N(0 <= N <= 10^9)

sum 大數余+快速

i++ AI ace har main accept rain pre fine Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total

6185 Covering (斯消元 矩陣快速)

CoveringTime Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1774    Accepted Submissio

6185 Covering (斯消元 矩陣快速)

本文參考自: 原文地址 Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1774    Ac

快速和矩陣快速模板

style class 計算 res can scan urn oid 模板 快速冪模板: ll qmod(ll x,ll n,ll mod) { ll res=1; while(n){ if(n&1) res=(res*x)%mo

二進制快速及矩陣快速

opened pla class () sed ont base 矩陣 spl 二進制快速冪 二進制快速冪雖然不難寫,但是無奈總是會忘,所以還是在這裏把板子寫一下。 二進制快速冪很好理解: 假設我們要求a^b,那麽其實b是可以拆成二進制的,該二進制數第i位的權為2^(i-1

整數快速與矩陣快速算法詳解

-m 技術分享 .com 需要 作用 鏈接 結合 奇數 title 轉載自:https://www.cnblogs.com/cmmdc/p/6936196.html 以防鏈接失效以失去如此好的博客,故復制一份以防丟失。 矩陣快速冪基礎講解 1.基礎知識儲備篇 矩陣的相關運

快速模板【快速+矩陣快速

快速冪模板: 引入:就是將冪以二進位制數分解,比如5的6次方,6被分解為2,4,即110,110&1為0,不執行ans=ans*a%mod,但是a=a*a每迴圈一次就執行一次,現在a=5*5,下一次迴圈11&1==1,執行ans=1*25,a=25*25;1

51Nod 1013 3的的和 快速+逆元

求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 收起 輸入 輸入一個數N(0 <= N <= 10^9) 輸出 輸出:計算結果 輸入樣例 3 輸出樣例 40  等比數列求和公式: Sum=a1*(1-q^n)/(

快速和矩陣快速

快速冪 快速冪就是快速算底數的n次冪。其時間複雜度為 O(log₂N), 與樸素的O(N)相比效率有了極大的提高 假設我們要求a^b,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2^(i-1),例如當b==11時,a^11=a^(2^0+2^1+2^3),由於

[快速&矩陣快速]

矩陣快速冪基礎講解 1.基礎知識儲備篇 矩陣的相關運算會再線性代數中學到。1.1矩陣的定義: N階方陣(N階矩陣):行數m與列數n相同的矩陣,如下圖所示就是一個44的方陣:* 行矩陣(行向量):只有一行的矩陣,下圖就是一個行矩陣:​  列矩陣(列向量):只

快速和矩陣快速(複雜度Olog(n))C++實現

快速冪 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 O(log₂N), 與樸素的O(N)相比效率有了極大的提高。 快速冪實現原理 快速冪的原理比較好懂,就是說假如我們求的是3^11,其實比較通用的辦法就是 for 1:11 a*=3; 時間複雜

快速(整數快速+矩陣快速

閒的無聊,總結一下快速冪的演算法,一直在用偏移運算子,現在試試多種方法: 快速冪就是求一個數的m次方的快速求法,因為正常情況下求次方可能就是一個數迴圈m次,然後乘一下,低次冪還好有一點,但是碰見高次的就不好辦了,比如: 求2的10次方,這個很好辦,for迴圈10次: #

二分快速,矩陣快速快速

前言 二分冪,快速冪,矩陣快速冪在算大指數次方時是很高效的。 求 a^n 的值是多少?n是1到10^18次方的一個整數。   求一個數的n次方,樸素的演算法就是直接for迴圈,一遍一遍的乘,a*a*a*a*a*a… …,O(N)的複雜度。此時,如果n很小的

快速 與矩陣快速

/*快速冪*/ int qpow(int a, int b) { int ans = 1, base = a; while (b) { if (b & 1) ans *= base;

【2018icpc焦作網路賽 Save the Room】【組合數【隔板法】【

【連結】 【題意&思路】  把一個數拆分成一個數的和求方法數。 比如 4=1+1+1+1=1+1+2=2+2=1+3=4 相當於有(n-1)個空插隔板,方法數即為2^(n-1). 【程式碼】 #include<bits/stdc++.h>

計蒜客 Give Candies (2的)

題目意思 大數輸入,求2的n-1次方 解題思路 2的n次方對mod取模會產生mod/2的迴圈,所以在大數陣列轉換成LL的時候取模要用mod/2,如果直接用mod在1e9+8時候出錯。不

快速和快乘

要去 ont pow 取模 當下 tex str 過程 return 一、快速冪取模概念   快速冪取模,顧名思義,就是快速的求一個冪式的模(余),比如a^b%c,快速的計算出這個式子的值。   在程序設計過程中,經常要去求一些大數對於某個數的余數,為了得到更快、計算範圍更

【模板】快速

模板 space 變量 pac esp const def class cstring 快速冪取模的模板,要註意所有變量都要開成long long類型的防溢出: #include<cstdio> #include<algorithm>