1. 欧几里得算法 //求最大公约数和最小公倍数 int gcb(int a, int b){ return b == 0 ? a : gcb(b, a%b); } 2.拓展欧几里得 求解线性方程组 ax + by + c = 0 void gcd(int a, int b, int &x, int &y, int &d){ if(!b){ d = a; x = 1; y = 0; }else{ gcd(a, a%b, x, y, d); y -= x*(a/b); } } //计算乘法逆元 int extgcd(ll a, ll b, ll &x, ll &y){ if(b == 0){ x = 1; y = 0; return a; }else{ ll ans = extgcd(b, a%b, x, y); ll t = x; x = y; y = t - a/b*y; return ans; } } //计算乘法逆元 int cal(ll a, ll b, ll d){ ll x, y; ll gcd = extgcd(a, b, x, y); if(d % gcd != 0) return -1; x = x*d/gcd; b = b/gcd; if(b < 0) b = -b; ll ans = x%b; if(ans < 0) ans += b; return ans; }