记得以前就写过这道题,但死活wa......这几天重新看了一下exgcd,做了noip2012的d2t1和这道。
exgcd用引用记录x,y的值
然后做poj1061的时候,发现仿佛ax=k(mod m) 这儿的a系数得是正的?如果a<0就把两边同乘-1,再用exgcd出x的特解
求出特解x0之后一切都好办了,可以很方便求出最小非负整数解(x0%(m/gcd(a,m))+m/gcd(a,m))%(m/gcd(a,m))或者以m/gcd(a,m)为周期可以求出满足某些条件的解。
(btw,ax+by=c同理,求出一个特解x0*(c/gcd)之后,可以求出同上的最小非负整数解,也可以b/gcd(a,b)为周期求出满足题目条件的解,通解为x=x0*(c/gcd)+(b/gcd)*k,k为任意整数)
上个代码
includeusing namespace std; #define ll long long ll g,x,y,m,n,l,x0,p,q,c,a; ll exgcd(ll a,ll b, ll&x,ll&y) { int t,g; if (b==0){x=1;y=0;return a;} g=exgcd(b,a%b,x,y); t=x;x=y;y=t-(a/b)*y; return g; } void solve() { if (m==n) {cout<<"Impossible"< 0 g=exgcd(a,l,p,q); if (c%g!=0) {cout<<"Impossible"< >x>>y>>m>>n>>l; solve(); return 0; }