快速冪及求逆元

2022-06-30 17:54:12 字數 1527 閱讀 8476

求a^k % p,(1 <= a, k, p <=10^9)

#include #include 

using

namespace

std;

typedef

long

long

ll;ll qmi(

int a, int b, int

p)

return

res;

}int

main()

}

如果用暴力的話,那麼就是o(n) = 10^9, 而快速冪則是logn級別的,log10^9 = 30;

原理是:比如4^5 = 4^2^0+4^2^2,

第一步先產生4^2^0 = 4 mod 10;

第二步再產生4^2^1 = 6 mod 10;

第三步再是生4^2^2 = 6 mod 10;

可以看到每一步都是前面的平方,那麼快速也是一樣,一開始底數a = a , a = a * a = a^2, a = a^2 * a ^2 = a^4, a = a^4 * a^4 = a^8;

有1的話,即(a&1)res = res * a; a >>= 1; a = a * a % p;

注意:我總是會忘記if(a & 1)這個條件。4^101, res = 4, res = 4 * 4^4 = 4^5;所以指數看起來是和,但是當加到底數裡面來得時候就是不斷的平方然後和之前的乘積了。

res = 1;if(a & 1) res = res * a % p; a >>= 1; a = a * a;

同餘逆元:

a/b 同餘 a * x mod m 

b * x 同餘 1 mod m

費馬定理:b、p互質,那麼b^p-1 同餘 p。(如2 ^ (3-1) = 4 % 3 = 1, 2^(5-1) = 16 % 5 = 1, 5^(3-1) = 25 % 3 = 1, 3^(5-1) = 81 % 5  = 1)

b * b^p-2 同餘 p

那麼b % p的乘法逆元就是b ^ p - 2。(如果b和p的餘數不為0,那麼就一定不存在逆元) (如果b、p互質,那麼由費馬定理一定存在逆元b^(p-2),因為質數都是》=2.

這樣就可以用快速冪來求出:

#include #include 

#include

typedef

long

long

ll;using

namespace

std;

int qmi(int a, int p, int

k)

return

res;

}int

main()

}

int res = qmi(a, p - 2, p);

if(a % p) printf("%d\n",res);

注意這裡不能用res返回的結果是0還是1來判斷,因為如果a = 2, p = 2, 就等於1了,所以要看a和p是不是沒有合數。

快速冪求逆元

概念 得到 給定nn組ai,piai,pi,其中pipi是質數,求aiai模pipi的乘法逆元,若逆元不存在則輸出impossible。注意 請返回在0 p 10 p 1之間的逆元。乘法逆元的定義 若整數b,mb,m互質,並且對於任意的整數 aa,如果滿足b ab a,則存在乙個整數xx,使得a b...

快速冪求逆元

費馬小定理 在模為 素數 p的情況下,有費馬小定理 a p 1 1 mod p 那麼a p 2 a 1 mod p 也就是說a的逆元為a p 2 而在模 不為素數 p的情況下,有尤拉定理 a phi m 1 mod m a m 同理a 1 a phi m 1 因此逆元x便可以套用快速冪求得了x a ...

演算法 快速冪,快速冪求逆元

基本思想 3 11 11 1011 3 1 3 3 2 9 3 4 81 3 8 6561 3 11 3 9 6561 第一種 當資料範圍m,k,p 10 9 int qmi int m,int k,int p return res 值得一提 k 1 除以2向0取整 詳細可以看狀態壓縮dp 內含位運...