欧几里得学习笔记
GCD
\(gcd(x,y)=gcd(x,y-x)\)
int GCD(int x,int y){return y? x:GCD(y,x%y);}
EXGCD
扩展欧几里得用于求一组特解 \((x,y)\) 使得 \(ax+by=(a,b)\)
\(\because ax+by=(a,b)\)
\(\therefore ax+by=(b,a\bmod b)=bx'+(a\bmod b)y'=bx'+(a-\lfloor\frac{a}{b}\rfloor b)\times y'=ay'+(x'-\lfloor \frac{a}{b} \rfloor y') \times b\)
即 \(ax+by=ay'+(x'-\lfloor \frac{a}{b} \rfloor y') \times b\)
所以只要每次递归进行以下操作
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=1,y=0; return a;}
ll ret=exgcd(b,a%b,y,x); y-=a/b*x;
return ret;
}
求逆元
若 \(a\times x \equiv 1\pmod b\),且 \(gcd(a,b)=1\),则称 \(x\) 为 \(a\) 的逆元,记为 \(a^{-1}\)。
可以用扩展欧几里得求解。
LL inv(int a,int mod){
LL x,y;
LL tmp=exgcd(a,mod,x,y);
return tmp==1?(x%mod+mod)%mod:-1;
}
线性处理
设 \(p=k\times i+r\),则有 \(k\times i+r \equiv 0 \pmod p\)
\(k\times r^{-1}+i^{-1} \equiv 0 \pmod p\)
\(i^{-1} \equiv -k\times r^{-1} \pmod p\)
\(i^{-1} \equiv -[\frac{p}{i}]\times (p \bmod i)^{-1} \pmod p\)
inv[i]=-(p/i)*inv[p%i];
求解线性同余方程
1.对于方程 \(a\times x + b\times y=c\),该方程等价于 \(a\times x \equiv c \pmod b\),有解的充分必要条件是 $gcd(a,b)|c $$
2.若 \(gcd(a,b)=1\),且 \(x_0,y_0\) 为 \(a\times x+b\times y=c\) 的一组特解。
则该方程的任意解可以表示为 \(x=x_0+b\times t\),\(y=y_0-a\times t\)
特别的,若要求最小非负整数 \(x\) , 则令 \(t=\frac{b}{gcd(a,b)}\),再令 \(x=(x\bmod t+t)\bmod t\)
bool solve(int a,int b,int c,int &x,int &y){
int d=exgcd(a,b,x,y);
if(c%d) return false;
int k=c/d;
x*=k;y*=k;
return true;
}