其實就是求解一個線性同餘方程
用擴展gcd做:
- function gcd(a,b:int64;var x,y:int64):int64;
- var
- t:int64;
- begin
- if b=0 then begin
- gcd:=a;
- x:=1;
- y:=0;
- end else begin
- gcd:=gcd(b,a mod b,x,y);
- t:=x;
- x:=y;
- y:=t-(a div b)*y;
- end;
- end;
然後求最小正整數解時直接mod一下就可以了~
- ans:=gcd(n,l,xx,yy);
- if x mod ans<>0 then begin
- writeln('Impossible');
- exit;
- end;
- xx:=xx*x div ans;
- if xx>0 then
- xx:=xx mod (l div ans);
- if xx<0 then begin
- xx:=xx mod (l div ans);
- if xx<>0 then xx:=xx+l div ans;
- end;
- writeln(xx);