線性求逆元

2022-09-04 13:33:12 字數 945 閱讀 8428

求逆元可以用費馬小定理或者擴充套件歐幾里得,也可以用如下的o(n)演算法:(背下來)

這個對p是有要求的,p(也就是模數)必須是質數

p不是質數的話,就用擴充套件歐幾里得比較方便了(兩個數有逆元當且僅當互質!)

inv[1]=1;

for(i=2;i<=p;i++)

inv[i]=(p-p/i)*inv[p%i]%p

也可以用另乙個o(n)的方法

經過一堆證明:

先用快速冪費馬小定理求出b[n](b[n]=inv[n!],而n!可以用線性來做。注意模p哦。複雜度是o(log(n)),與後來的o(n)一加就可以刪去前者了!)

因為inv[n]*b[n-1]=b[n]

又因為b[n-1]*(n-1)!=1

所以方程左右兩邊同時乘以(n-1)!,得

inv[n]=b[n]*a[n-1]*************(a[n]=n!,o(n)可得該陣列)

完美。0w0。

我也不知道這樣可以幹嘛,我想想。。。我大概聽了一節假的數論。

補充一下怎麼利用b[n]把b陣列也給求出來吧~

b[n-1]*inv[n]=b[n]

同理,我們在方程的左右兩邊同時乘以n,得:

b[n-1]=b[n]*n

qwq再來一次o[n],真完美呀真完美,b[ ]陣列也求出來了。

人類的本質就是復讀機。

——rxz

那麼知道這些(a[  ],b[  ],inv[  ],當然是在模p意義下),至少可以拎過來求組合數:

c(n,m)=a[n]%p*b[m]%p*b[n-m]%p。

這樣就可以o(2*n+log(n))預處理,o(1)輸出。

快到飛起!麻麻再也不用擔心我超時啦!

線性求逆元

在某些組合數的計數問題中,經常會用到逆元,這裡我們講一下如何線性求出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...

線性求逆元及其過程

連續兩天考了求逆元。所以想著寫一篇關於線性求逆元的部落格。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...