Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

自己推了一下午,把好多东西关联起来了,对像我一样的新手可能比较有用,如推理有错,还请大牛提示。。

Posted by NARUTOACM at 2009-09-24 21:53:48 on Problem 1061
根据题意,青蛙若想碰面的话,则必有(x+mt)-(y+nt)=p*L;(p为任意整数)。
方程化为:
(m-n)t-(y-x)=pL;则有((m-n)t-(y-x))mod(L)=0(mod为取模运算)。
即为:
(m-n)t mod L=y-x;为线性同余方程。此方程有解当且仅当y-x能被m-n和L的最大公约数(记为gcd(m-n,L)),即gcd(m-n,L)|y-x。这时,如果x0是方程的一个解,即当t=x0时,
(m-n)t mod L=y-x成立,那么所有的解可以表示为:
{x0+k(L/gcd(m-n,L))|(k∈整数)}。
设d=gcd(m-n,L),根据裴蜀定理,则必存在整数对(r,s)使得(m-n)*r+L*s=d;则可得
t=r*(y-x)/d。证明:把t代入得:
(m-n)t-(y-x)=((m-n)r(y-x)-d(y-x))/d=((y-x)((m-n)r-d))/d=(y-x)*(-L*s)/d.
因为d|y-x,所以L|(y-x)*(-L*s)/d。即
((m-n)t-(y-x))mod(L)=0成立。所以问题转换为求r,也就是解一个含2个数的不定方程
(m-n)*r+L*s=d。
下面在讨论求解不定方程的解法:
求解ax+by=gcd(a,b).
ax+by=gcd(a,b)=gcd(b,a%b)(欧几里德求最大公约数算法)。
gcd(b,a%b)=b*x'+(a%b)*y'.
所以有ax+by=b*x'+(a%b)*y'=b*x'+(a-a/b*b)*y'=ay'+b(x'-a/b*y').
因此由对比系数法得:x=y';y=x'-a/b*y'。
由这个得出扩展的欧几里德算法:
int exGcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
       x = 1;
       y = 0;
       return a;
}
int r = exGcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
    return r;
}//返回a和b的最大公约数。

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator