pku 1061 - 青蛙的约会

来源:互联网 发布:淘宝卖家评价回复模板 编辑:程序博客网 时间:2024/05/21 12:08

题目:中文题。两只青蛙在一个周长为l的圆上同步跳,初始位置为x,y,每次跳的距离为m,n;

            问最早什么时候相遇,求步数。

分析:数论、扩展欧几里得算法。

            1.如果d = gcd(a, b),则必能找到整数x和y,使d = a*x+ b*y,证明略;

            2.如果gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解,证明略;

            计算出公约数t,解出的xx*(x-y)/ t 对 l/t 取余数即为要跳的最小步数;

说明:具体过程见代码;

#include <cstdio>__int64 exgcd(__int64 a, __int64 &x, __int64 b, __int64 &y){__int64 r;if (b == 0) {x = 1;y = 0;return a;}r = exgcd(b, y, a%b, x);y = y-a/b*x;return r;}int main(){__int64 x, y, m, n, l, t, xx ,yy, rr;while (~scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l)) {t = exgcd(n-m, xx, l, yy);if ((x-y)%t != 0)puts("Impossible");else {xx = xx*(x-y)/t;rr = l/t;xx = (xx%rr+rr)%rr;printf("%I64d\n",xx);}}    return 0;}


0 0
原创粉丝点击