乘法逆元的線性篩法

2022-03-28 20:03:15 字數 1281 閱讀 4251

目錄位址

對於已知模數 \(m\) ,求出在模 \(m\) 意義下, \(1\)~\(n\) 的逆元 ( \(n\leq m-1\) )

\(n\) 較大,只支援 \(o(n)\) 複雜度的演算法

(一般保證 \(m\) 是質數,否則有的數不存在逆元)

由遞推的方法 \(o(n)\)

考慮模 \(m\) 意義下 \(1^\equiv 1(\mod m)\)

考慮求 \(n\) 的逆元,可知 \(m=\lfloor\rfloor\cdot n+(m\mod n)\)

記 \(a=m/n,b=m\%n\) 則 \(m=an+b,0\leq b

因此 \(an+b\equiv 0(\mod m)\)

方程兩邊乘上 \(n^\) 得到

\(a+b\cdot n^\equiv 0(\mod m)\)

\(n^\equiv -a\cdot b^(\mod m)\)

即 \(n^\equiv -\lfloor\rfloor\cdot (m\mod n)^(\mod m)\)

inv[1]=1;

for(int i=2;i<=n;i++)

利用線性篩的性質,以及逆元在取模意義下的積性,可以很快寫出線性篩的方法:

inv[1]=1;

for(int i=2;i<=n;i++)

for(int j=0;j因為質數的個數大約是 \(n\over \ln n\) 個,快速冪的複雜度 \(o(\log m)\) ,\(n\leq m-1\) ,因此質數部分的複雜度為 \(o(n)\)

而合數的個數大約是 \((n-)\) 它們是線性的,因此複雜度為 \(o(n)\)

最終得出總複雜度為 \(o(n)\)

考慮到我們可以 \(o(n)\) 內求出 \(\forall i\leq n,i!\)

而我們可以花費 \(o(\log m)\) 的時間求出 \(n!^\) ,由於 \(n\leq m-1\) ,複雜度也可以認為是 \(o(n)\) 的

再利用公式: \(i!^\equiv (i+1)!^\cdot (i+1)(\mod m),i^\equiv i!^\cdot (i-1)!(\mod m)\)

得出結論:

fac[0]=1;

for(int i=1;i<=n;i++)

invf[n]=fpow(fac[n],m-2);

for(int i=n-1;i>=0;i--)

for(int i=1;i<=n;i++)

總複雜度 \(o(n)\)

BZOJ 3823 定情信物 線性篩乘法逆元

題目大意 n維多面體中有多少n 1維,n 2維,n 3維。1維元素,求他們的異或和並 p。思路 考試題,當時做的時候不會線性篩乘法逆元,就得了70分。演算法和標程不太一樣,標程好象是遞推,但是我空間想象力不夠,沒推出來。只能找規律了。花了乙個半小時才找出來的規律。code include inclu...

乘法逆元 線性求mod p的所有數逆元

逆元存在的 求單個逆元,一般用快速冪或者擴充套件歐幾里得演算法,複雜度為log p 若是遞推求解所有逆元,複雜度為線性。前幾天在看 lucas 定理的時候發現要求 1,2 p 1modp 1,2,p 1modp 的逆元,然後就看到了乙個 n n 的做法發現太神了,雖然想起來是挺簡單的 這個做法實際上...

線性篩法(尤拉篩法)

嗯在剛剛 沒錯就是在幾分鐘之前 我學會了線性篩法 實在是乙個很好的篩法 正常的篩法,都會對乙個數篩多次 但是尤拉篩法不會 尤拉篩法是用它的最大因數去篩 別跟我說最小質因數,那個很難讓人理解 雖然最小質因數和最大因數是一樣的 我們假設乙個數k,它是t的最大因數 容易知道t是不唯一的 那我們要乘以乙個質...