1. 程式人生 > >弱智就要多努力

弱智就要多努力

擴充套件歐幾里得求逆元:

int extgcd(int a, int b, int &x, int &y)
{
    int d = a;
    if(b != 0)
    {
        d = extgcd(b, a%b, y, x);
        y -= (a / b) * x;
    }
    else x = 1, y = 0;
    return d;
}
int mod_inv(int a, int p) //求a模p的逆元,要求a與p互質
{//即是求ax≡1(mod p)中的x的最小正整數,轉換一下就是ax+py=1,若a與p不互質,顯然無解。若p為負直接p = abs(p)
int x, y; extgcd(a, p, x, y); return (x%p + p) % p; }

費馬小定理求逆元:
:設p為質數,gcd(a,p)=1,那麼一定有ap11(modp)
當滿足以上條件時,根據費馬小定理可得aap21(modp),即a模p的的逆元為ap2modp,可以用快速冪求出

ll mod_pow(ll a, ll b, ll p)
{
    ll ans = 1;
    a %= p;
    while(b)
    {
        if(b & 1) ans = ans * a % p;
        a = a * a % p;
        b >>= 1
; } return ans; } ll mod_inv(int a, int p) { return mod_pow(a, p-2, p); }

尤拉函式求逆元:
ϕ(m)表示小於等於m且與m互素的正整數的個數。
如果xm互質,則有xϕ(m)1(modm),即xxϕ(m)11(modm)xϕ(m)1modm即為x的逆元。
m為質數的情況下,ϕ(m)=m1,即為費馬小定理。
尤拉函式點這裡:尤拉函式
程式碼不再貼了

線性時間求所有逆元:
規定p為質數,且111(modp)
p=ka+b,b<a,1<a<

p,即ka+b0(modp)
兩邊同時乘以a1b1,得到
kb1+a10(modp)
a1kb1(modp)
a1p/a(pmoda)1(modp)
從頭開始掃一遍即可,時間複雜度O(n)

int inv[N];
inv[1] = 1;
for(int i = 2; i < N; i++)
    inv[i] = (p - p / i) * inv[p % i] % p;