弱智就要多努力
阿新 • • 發佈:2019-01-23
擴充套件歐幾里得求逆元:
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;
}
費馬小定理求逆元:
當滿足以上條件時,根據費馬小定理可得
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);
}
尤拉函式求逆元:
令
如果
在
尤拉函式點這裡:尤拉函式
程式碼不再貼了
線性時間求所有逆元:
規定
設 p
兩邊同時乘以
從頭開始掃一遍即可,時間複雜度
int inv[N];
inv[1] = 1;
for(int i = 2; i < N; i++)
inv[i] = (p - p / i) * inv[p % i] % p;