您的位置:首页 > 其它

pku1061青蛙的约会

2010-08-14 11:22 309 查看
#include<iostream>
using namespace std;
__int64 result;
__int64 exGCD(__int64 a,__int64 b,__int64 &x,__int64 &y)
{
__int64 t,ret;
if(b==0){ x=1;y=0;return a;}
ret = exGCD(b,a%b,x,y);
t=x; x=y; y=t-(a/b)*y;
return ret;
}
bool fg(__int64 a,__int64 b,__int64 n)
{
__int64 x,y,d,x0;
d=exGCD(a,n,x,y);
if(b%d!=0) return false;
x0=x*(b/d)%n;
result=(x0+n)%n;
return true;
}
int main()
{
__int64 x,y,m,n,L;
while(cin>>x>>y>>m>>n>>L)
{
if(fg(n-m,x-y,L)) cout<<result<<endl;
else cout<<"Impossible"<<endl;
}
return 0;
}


http://acm.pku.edu.cn/JudgeOnline/problem?id=1061

二、 同余模运算
1.定理:设d=gcd(a,b),在必存在两个整数x,y使得d=ax+by成立。
2.鸥几里德公式:设d=gcd(a,b),且d’=gcd(b,amodb)d= ±d’
证明:amodb=a-[a/b]b,由于d|a,d|b,d|amodb
因此d| d’。反之,d’|amodb)则d’|a,又由于d’| b
所以d’| d
d= ±d’
鸥几里德公式的推广形式:ax+by=d= d’= bx’+(amodb)y’
= bx’+( a-[a/b]b)y’
= a y’+b (x’-[a/b] y’)
如果b=0,则gcd(a,b)= ax=1y=0
3.计算同余方程ax=b(modn)(n>0)
1)通过鸥几里德公式的推广形式求出d=gcd(a, n)和两个整数x’ y’满足d=ax’+ny’.
显然,x’是方程ax=b (modn)的一个解;
2)d不能整除b,则方程ax=b(modn)无解;否则有d个解,令
X0= x’(b/d) modn,其余的d-1个解可以通过对模n加上(n/d)的倍数。
即:Xi= (X0+i(n/d) ) modn.
题意: 两只青蛙在圆上往相同的方向跳 跳到同一点上才见面求此时青蛙最少跳的次数 题目给出了 青蛙在圆形数轴上的位子 x y 和 它们各自一跳的距离 m n 和L 圆周长。

思路: 假设青蛙跳t次相遇 则满足等式 (x+mt)%L=(y+mt)%L 变形得到 (n-m)t%L=(x-y)%L --->at%L=b%L--->at=b(mod L) 然后根据公式计算就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: