zoukankan      html  css  js  c++  java
  • 【BZOJ1477】青蛙的约会

    Description

    两个物体在一个周长为l的环上同方向运动, A初始时位置为a,速度为m,B初始位置为b,速度为n,求何时相遇。

    Solution

    根据题意,我们不难列出方程,推导如下

    $a+mt equiv {b+nt} pmod l$

    $(m-n)t equiv {b-a} pmod l$

    $(m-n)t+kl=b-a$

    最终我们得到了一个线性模方程,可以用Exgcd求解。

    根据裴蜀定理,该方程有整数解,当且仅当(b-a)%t=0,因此我们可以判断问题是否有解。

    最终Exgcd求出的答案可能为负数,我们将它加上若干l即可

    Code

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll exgcd(ll a, ll b, ll &x, ll &y) {
     5     if (!b) {
     6         x = 1; 
     7         y = 0;
     8         return a;
     9     }
    10     ll gcd = exgcd(b, a % b, x, y);
    11     ll x2 = x;
    12     ll y2 = y;
    13     x = y2;
    14     y = x2 - (a / b) * y2;
    15     return gcd;
    16 }
    17 inline ll read() {
    18     ll ret = 0, op = 1;
    19     char c = getchar();
    20     while (!isdigit(c)) {
    21         if (c == '-') op = -1; 
    22         c = getchar();
    23     }
    24     while (isdigit(c)) {
    25         ret = ret * 10 + c - '0';
    26         c = getchar();
    27     }
    28     return ret * op;
    29 }
    30 int main() {
    31     ll a, b, m, n, l;
    32     a = read(); b = read(); m = read(); n = read(); l = read();
    33     ll aa = m - n;
    34     ll bb = l;
    35     ll retx, rety;
    36     ll ret = exgcd(aa, bb, retx, rety);
    37     if ((b - a) % ret != 0) puts("Impossible"); 
    38     else {
    39         ll ans = (b - a) / ret * retx;
    40         while (ans < 0) ans += l;
    41         printf("%lld
    ", ans % l);
    42     }
    43     return 0;
    44 }
    AC Code
  • 相关阅读:
    var在PHP和JS中的使用
    修改PHP上传文件大小限制的方法
    Linux中tail指令详解
    drupal7 profile2模块获取个人信息
    drupal7 STMP邮件模块配置
    drupal读取mysql的longblob字段
    drupal7 自定义登录&找回密码页面,注意事项
    转 VS Code 快捷键大全,没有更全
    权力关进笼子里
    drupal的权限设置
  • 原文地址:https://www.cnblogs.com/shl-blog/p/11232122.html
Copyright © 2011-2022 走看看