poj1061 青蛙的约会(扩欧)

记得以前就写过这道题,但死活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为任意整数)

上个代码

include
using 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;
}

  

你可能感兴趣的:(poj1061 青蛙的约会(扩欧))