扩展欧几里得和乘法逆元
扩展欧几里得可以计算出gcd的同时,计算出一组最小特解,以表示其通解
推导过程见http://blog.csdn.net/zhjchengfeng5/article/details/7786595
LL ex_gcd(LL a, LL b, LL &x, LL &y) { if (b == 0) { x = 1; y = 0; return a; } LL rec = ex_gcd(b, a%b, y, x); y -= a / b*x; return rec; }
其中通解:
x = x0 + b*t;
y = y0 + a*t;
而乘法逆元则是在计算(a/b)%mod时,可以转化为(a*b的逆元)%mod,如果b过大,可能需要取余,而a/(b%mod)%mod显然是错误的,这里就可以利用乘法逆元求出结果。
LL inv(LL b, LL m) { LL x, y; ex_gcd(b, m, x, y); return (x%m + m) % m; }