poj 1061 青蛙的约会

// 题意: 解同余方程 (m-n)t≡y-x(mod L),求出t的最小解

#include<iostream>
using namespace std;
int x_0,y_0,q;
void extend_eulid(int a,int b) //x_0*a+y_0*b=gcd(a,b)=q
{

if(b==0)
{
x_0=1;y_0=0;q=a;
}
else
{
extend_eulid(b,a%b);
int temp=x_0;
x_0=y_0;y_0=temp-a/b*y_0;
}
}
// 解同余方程 (m-n)t≡y-x(mod L) , 相当于ax≡n (mod b),即 a=m-n, x=t, n=y-x , b=L
int main()

{
long long x,y,m,n,L,t;
cin>>x>>y>>m>>n>>L;
extend_eulid(m-n,L);
if( (y-x)%q != 0 )
cout<<"Impossible\n";
else
{
t = x_0*(y-x)/q;
int ff=L/q > 0 ? L/q : -L/q; //要对(L/q)取绝对值,因为q=(m-n,L)有可能是负值
int X=(t%ff+ff)%ff;

cout<<X<<endl;
}
return 0;
}

/*
形如 ax≡n (mod b),可化成 ax + by = n, x有整数解的充分必要条件是 n % (a,b)==0,(a,b)表示gcd(a,b)
方程 a*x+b*y=n;我们可以先用扩展欧几里德算法求出一组x_0,y_0。
也就是 a * x_0 + b * y_0 =(a,b);
然后两边同时除以(a,b),再乘以n。
这样就得到了方程 a * x_0 * n/(a,b)+ b * y_0 * n/(a,b)= n;
方程的一个解: x = x_0 * n/(a,b), y = y_0 * n/(a,b)
其他的解都为 x_1,2...≡x+(b/(a,b))*i , y_1,2...≡y-(a/(a,b))*i (0 <=i<=(a,b)-1)。 i=0 时即为上面的一组解
总共有gcd(a,b)组解

令ff=b/(a,b),则x的最小非负整数解为 x = x_0 * n/(a,b), X = ( x % ff + ff ) % ff ;
*/

posted on 2011-07-17 23:41  sysu_mjc  阅读(116)  评论(0编辑  收藏  举报

导航