您的位置:首页 > 其它

pku1061(扩展欧几里德算法,中国剩余定理,模线性方程)

2010-07-22 14:54 302 查看
http://162.105.81.212/JudgeOnline/problem?id=1061

公式:(ans*m - x) = (ans*n - y) mod L => (n-m)*ans = (x - y) mod L,(ans表示跳跃的次数);直接代入模板就行啦。

详细介绍:http://hi.baidu.com/%B1%BF%D0%A1%BA%A2_shw/blog/item/0676025d56a87d4afbf2c093.html

#include  < iostream >
using namespace std;
__int64  result;
__int64  gcd( __int64 a, __int64 b, __int64 &  x, __int64 &  y )
{
__int64 t,ret;
if (  ! b ) {
x =   1 ,y =   0 ;
return  a;
}

ret =  gcd( b, a %  b, x, y );
t =  x, x =  y, y =  t -  a /  b *  y;

return  ret;
}

bool   f( __int64 a, __int64 b, __int64 n )
{
__int64  d, e, x, y, i;

d =  gcd( a, n, x, y );
if ( b %  d !=   0  )  return   false ;

result =  ( x *  (b /  d ) %  n +  n ) %  n;
return   true ;
}

int  main()
{
__int64 x, y,m,n,l;

while (scanf( "%I64d%I64d%I64d%I64d%I64d",&x, & y, & m, & n, & l) !=  EOF )
{
if ( f( n -  m, x -  y, l ) )  printf( "%I64d/n" , result );
else                       printf( "Impossible/n" );
}

return   0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: