這是一道模板題
給定n,p求1~n中所有整數在模p意義下的乘法逆元。
輸入格式:
一行n,p
輸出格式:
n行,第i行表示i在模p意義下的逆元。
輸入樣例#1: 複製
10 13
輸出樣例#1: 複製
179108112
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 #include2using
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 #include2using
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 為質數。逆元可以線...