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<iostream>
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"<<endl;return;}
	a=m-n;c=y-x;if (a<0){a=-a;c=-c;} // ap=c(mod l) a的系数要>0 
	g=exgcd(a,l,p,q);
	if (c%g!=0) {cout<<"Impossible"<<endl;return;}
	x0=p*(c/g);
	cout<<(x0%(l/g)+l/g)%(l/g)<<endl;
}
int main()
{
	cin>>x>>y>>m>>n>>l;
	solve();
	return 0;
}

  

posted @ 2020-02-10 14:45  coastal_taipan  阅读(120)  评论(0编辑  收藏  举报