1. 程式人生 > >【模板】【數論】快速冪和快速乘法

【模板】【數論】快速冪和快速乘法

快速冪

快速冪取模演算法可以在O(log2b)的時間內求出abmodp的值。

運用了二進位制的思想,實質是對b進行二進位制分解。

程式碼:

typedef long long LL;
LL ksm(int a,int b,int p)//最好不要把函式名取成power、modpower之類的,考試的時候可能會掛233
{
    LL res=1;
    while(b)
    {
        if(b&1) res=res*a%p;//如果b是奇數,或者說當前這一位二進位制是1
        a=a*a%p;//計算a^2,a^4,a^8,a^16...,a^(2^i)
        b>>=1
;//b除以2,或者說處理下一位二進位制 } return res; }

快(龜)速乘法

“快”讀作“龜”(霧

O(log2b)的時間內求a×bmodp。由於直接乘是O(1)的時間複雜度,所以又被叫做“龜速乘法”。

主要用途是解決大數相乘,而且模數較大的問題。如兩個1e18級別的數相乘,模數也是1e18級別。任憑你怎麼取模,最後還是要爆long long。解決方法之一是寫高精度乘法和高精度取模。但是我很懶,並不想寫高精度。那該怎麼辦?可以把乘法轉化成加法。我一個個地在答案上加a,每加一個a取一次模,這樣總不會爆long long了吧!但是這樣的時間複雜度太高,估計算一輩子也算不完。我們可以藉助快速冪的思想,創造一種“快速乘法”演算法,就是把快速冪裡面所有的乘號換成加號。

再強調一遍,雖然這個演算法被叫做“快速乘法”,但是它並不如直接做乘法快!

程式碼:

typedef long long LL;
LL ksc(int a,int b,int p)//拼音大法好
{
    LL res=0;//注意初始答案是0而不是1
    while(b)
    {
        if(b&1) res=(res+a)%p;
        a=(a+a)%p;
        b>>=1;
    }
    return res;
}

相關推薦

模板數論快速快速乘法

快速冪 快速冪取模演算法可以在O(log2b)的時間內求出abmodp的值。 運用了二進位制的思想,實質是對b進行二進位制分解。 程式碼: typedef long long LL; LL ksm(int a,int b,int p)//最好不要把函

快速快速取模

它的 signed 1.5 原來 現在 轉化 mil ram 自己 首先,快速冪的目的就是做到快速求冪,假設我們要求a^b,按照樸素算法就是把a連乘b次,這樣一來時間復雜度是O(b)也即是O(n)級別,快速冪能做到O(logn),快了好多好多。它的原理如下:   假設我們要

快速快速乘法

RT ll Quick_Pow(ll a,ll n) { ll ret=1; ll temp=a%p; while (n){ if (n&1) ret

FZU - 1759Super A^B mod C (數論快速快速乘,尤拉降冪,指數迴圈節,模板

題幹: Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are mult

快速模板快速+矩陣快速

快速冪模板: 引入:就是將冪以二進位制數分解,比如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

#121-快速慢速乘序列的第K個數

Description BSNY 在學等差數列和等比數列,當已知前三項時,就可以知道是等差數列還是等比數列。現在給你序列的前三項,這個序列要麼是等差序列,要麼是等比序列,你能求出第 k 項的值嗎。 如果第 k 項的值太大,對 200907 取

學習筆記快速+矩陣+矩陣乘法+矩陣快速

今天晚上我學習了矩陣 1、快速冪 通常,我們要算bpmodkbpmodk是這麼算的: ans := 1; for i := 1 to p do ans := ans * b mod k;

板子gcd、exgcd、乘法逆元、快速快速乘、篩素數、快速求逆元、組合數

1.gcd int gcd(int a,int b){return b?gcd(b,a%b):a;} 2.擴充套件gcd )extend great common divisor ll exgcd(ll l,ll r,ll &x,ll &

模板練習——AC自動機Keywords Search HDU - 2222

rpg soc key words 練習 evm cdc rmi css x床堂0jz直寐0裙brhttp://tushu.docin.com/sghp1512 6茲c苯晌62恢uk爻2http://tushu.docin.com/ipt586 gw誹喜2i4偎e2擻a

BZOJ 2038 2009國家集訓隊 小Z的襪子模板·莫隊

com 技術 bsp 高效 題解 數量 div image 概率 【題解】   1,先說說莫隊算法。     莫隊算法是用來離線處理區間問題的算法。非常易於理解和使用,且運用十分廣泛。     假設我們現在已知區間[L,R]的答案,如果我們能以較低的時間復雜度擴展得到區間

模板·並查集洛谷 P3367 模板並查集

題目:並查集 思路: 複習…… 第一次提交忘寫路徑壓縮T了…… 結論:打過再多遍的模板也要檢查一下啊…… 程式碼: #include<bits/stdc++.h> using namespa

模板·次小生成樹 The Unique MST

程式碼: #include<cstdio> #include<vector> #include<cstring> #include<algorithm>

模板·樹的重心 codevs 3639 樹的中心

題目:樹的中心 樹的重心 找到一個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹儘可能平衡。 所以dfs下就好了。 程式碼: #include<bits/stdc++.h> using names

模板·字尾陣列/sa洛谷 P3809 模板字尾排序

題目:字尾排序 程式碼: #include<bits/stdc++.h> using namespace std; #define maxn 1000000 int n,m; char a[maxn+5]; int sa[maxn+5],rk[maxn+5];

精華排序演算法彙總——氣泡排序快速排序

日常說明:有錯誤歡迎大家指正。另外本部落格所有的程式碼博主編寫後均除錯通過。重要提醒!!!!博主使用的是VS2017,如果有低版本的小夥伴最好新建空專案將此程式碼複製上去。 更多演算法請關注我的演算

HDU1395 ZOJ1489 2^x mod n = 1暴力法+數論

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17824    Accepted Submission(s

拉格朗日求自然數cf622F

F. The Sum of the k-th Powers There are well-known formulas:  ,   , .  Also mathemati

TP5本地執行正常,線上執行某頁面出現模板檔案不存在問題的解決辦法

相信許多小夥伴和我一樣,明明在本地執行頁面一切正常,而到線上(本人是用的虛擬主機)出現瞭如下圖的問題: 其實這個問題出現的原因很簡單,就是我們開發是在windows 系統下,windows系統對大小寫不敏感,而虛擬主機Linux,區分大小寫,所以解決辦法很簡單,如下圖所示:   解決方法就

快速矩陣快速模板

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

快速+矩陣快速模板

#include<iostream> #include<cstring> #include<cmath> #include<cstdlib> #include<cstdio> #include<algorithm> #inc