求 a*x=b(mod n).
先转化为求 ax+ny=b.
用扩展欧几里德求出 ax+ny=gcd(a,n).
扩展欧几里德原理:bx+(a%b)y=1 <=> ay+b(x-[a/b]*y)=1
定理:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n)|b.
令d=gcd(a,n).
设为x' ,y'为所求 满足ax'+ny'=gcd(a,n).
则原方程有一解x0=x'*(n/d).
定理:假设ax=b(mod n) 有解,x0是该方程的任意一个解,则该方程模n恰有d个不同的解,分别为:xi=x0+i*(n/d) (其中i=1,2,...d-1).
证明:令 xi = x0 + i*(n/d) (mod n);
由 a*xi (mod n) = a * (x0 + i*(n/d)) (mod n)
= (a*x0+a*i*(n/d)) (mod n)
= a * x0 (mod n) (由于 d | a)
= b
题目求最小正整数解。
定理:(转自http://www.cppblog.com/mythit/archive/2009/06/12/87514.html)
设e=x0+n,方程ax=b(mod n)的最小整数解x1=e mod (n/d),最大整数解x2=x1+(d-1)*(n/d)。
POJ 1061:
此处必须注意求出了的t=n/d可能为负数。
POJ 2115:
一开始用1<<k 一直WA ,用1LL才AC,求指教~