線性求逆元

2021-08-07 19:14:05 字數 1794 閱讀 5337

在某些組合數的計數問題中,經常會用到逆元,這裡我們講一下如何線性求出1到n在模p意義下的逆元,注意p為質數。

假設我們當前要求a在模p意義下的逆元。 令p

=ak+

r,(0

≤rp =a

k+r,

(0≤r

,那麼 ak

+r≡0

(modp)

a k+

r≡0(

modp

),然後恒等式變形,兩邊同時乘a−

1×r−

1 a−1

×r−1

, 則有a

−1+k

r−1≡

0(modp

) a−1

+kr−

1≡0(

modp

),移項 既得a

−1≡−

kr−1

(modp)

a −1

≡−kr

−1

(modp)

,就有 a−

1≡−[

pa]×

(pmoda)−

1(modp

) a−1

≡−[p

a]×(

pmoda)

−1

(modp)

,又因為我們知道與-x同餘其實就是等於說與p-x同餘,比如說 7≡

−3≡5

−3≡2

(mod5)

7 ≡−

3≡5−

3≡2(

mod5)。

**:

var

inv:array[0..1000] of longint;

i,n,p:longint;

begin

readln(n,p);

inv[1]:=1;

for i:=2

to n do

begin

inv[i]:=inv[p mod i]*(p-p div i) mod p;

end;

for i:=1

to n do

write(inv[i],' ');

end.

var

inv:array[0..1000] of longint;

i,n,p:longint;

begin

readln(n,p);

inv[1]:=1;

for i:=2

to n do

begin

inv[i]:=(-inv[p mod i]*(p div i) mod p+p) mod p;

end;

for i:=1

to n do

write(inv[i],' ');

end.

接下來求(1-n)!逆元,由於過於簡單,直接上**

#include

#include

typedef long long ll;

const ll mo=1e+9+7;

const int n=2000000;

using namespace std;

ll fac[n+55],inv[n+56];

ll power(ll a,int b)

return t%mo;

}int main()

由於我的水平有限,難免會有些寫錯的地方,希望大家批評指正,多多包容,thank you for your patience.

線性求逆元

求逆元可以用費馬小定理或者擴充套件歐幾里得,也可以用如下的o n 演算法 背下來 這個對p是有要求的,p 也就是模數 必須是質數 p不是質數的話,就用擴充套件歐幾里得比較方便了 兩個數有逆元當且僅當互質!inv 1 1 for i 2 i p i inv i p p i inv p i p也可以用另...

線性求逆元及其過程

連續兩天考了求逆元。所以想著寫一篇關於線性求逆元的部落格。inv 1 1 for int i 2 i n i inv i mod long long mod i inv mod i mod 我們要求i在模p意義下的逆元inv i 那麼我們就設ki r p,所以ki r移項可以得到 r 兩邊同時除以i...

線性求逆元及其過程

連續兩天考了求逆元。所以想著寫一篇關於線性求逆元的部落格。inv 1 1 for int i 2 i n i inv i mod long long mod i inv mod i mod 我們要求i在模p意義下的逆元inv i 那麼我們就設ki r p,所以ki r0 mod p 移項可以得到 r...