模板 乘法逆元

2022-05-16 12:15:30 字數 2165 閱讀 8180

這是一道模板題

給定n,p求1~n中所有整數在模p意義下的乘法逆元。

輸入格式:

一行n,p

輸出格式:

n行,第i行表示i在模p意義下的逆元。

輸入樣例#1: 複製

10 13

輸出樣例#1: 複製

179

108112

534

1≤n≤3×106,n輸入保證 p 為質數。

關於這道題,其實就是乙個求逆元的模板題,常見的有三種方法,在這裡只介紹兩種方法:

1.費馬小定理+快速冪(能水64分)

費馬小定理:若p為素數,a為正整數,且a、p互質。 則有a^(p−1)≡1(mod p)

又因為a*a的逆元(w)等於1,所以a^(p−1)≡a*w(mod p)

故w在模p意義下是等於a^(p-2)的(記住就好)

所以問題就轉化成了求a^(p-2),我們就聯想到了快速冪(如果不知道什麼是快速冪,我也沒招)

這個演算法由於快速冪的優化,時間複雜度還是比較可觀的,基本可以穩定在(nlogn)

附上該方法的**:

1 #include2

using

namespace

std;

3long

longp;4

long

long qpow(long

long x,long

longy)5

13 x=((x%p)*(x%p))%p;

14 y>>=1;15

}16return

ans;17}

18int

main()

1926

return0;

27 }

2.線性遞推(100分o(n)的神級演算法)

p=ki+rk=p/i⌋,r=pmodi(i

那麼顯然 ki+r≡0(mod p)  

我們將左右同時乘以i和r的逆元即可得到

k∗r^−1+i^−1≡0(modp)

i^−1≡−k∗r^−1(modp)

代入k和r

i^−1≡−⌊p/i⌋∗(p mod i)^-1   (modp)

由於逆元一定是整數,那麼我們在等式左右同時乘以(p mod i)^-1倍的p,由於在模p意義下,等式依然成立

最終狀態:

inv[i] = (p - p / i) * inv[p % i] % p;(inv指逆元)

附上本演算法的**:

1 #include2

using

namespace

std;

3long

long p,c[3000005];4

intmain()515

return0;

16 }

模板 乘法逆元

適用 求某乙個數在模意義下的乘法逆元。如果a p互質,那麼有ap a就是p的倍數,所以有ap a modp ap 1 1 modp 所以只要打乙個快速冪就ok了。code include using namespace std int n,p int power int x,int k return...

模板 乘法逆元

這是一道模板題 給定n,p求1 n中所有整數在模p意義下的乘法逆元。輸入格式 一行n,p 輸出格式 n行,第i行表示i在模p意義下的逆元。輸入樣例 1 複製10 13 輸出樣例 1 複製179 108112 534 1 n 3 106,n1 n 3 106,n輸入保證 p p p 為質數。先扔個線性...

luogu P3811 模板 乘法逆元

這是一道模板題 給定n,p求1 n中所有整數在模p意義下的乘法逆元。一行n,p n行,第i行表示i在模p意義下的逆元。10 13179 108112 534說明 1 leq n leq 3 times 10 6,n p 20000528 1 n 3 10 6,n 輸入保證 p p 為質數。逆元可以線...