高次冪取模 (快速冪取模)
來自百度文庫 PPT作者 張鵬
只能說下載分數太貴了。。
基本概念及思想
¡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>