CF1143D The Beatles(数学)

题目链接

  有\(n\)个快餐店,每个快餐点之间间隔\(k\)米,可以理解为是一个\(n × k\)的环,Sergey 从\(s\)位置作为起始点,每次走\(l\)的长度,但是他忘记了\(s\)\(l\)是多少,只知道从\(s\)\(s + l\)位置到最近的快餐店需要走多远。让我们求出来从重新回到\(s\)位置需要走多远的路程,分别求出最大值和最小值。
  根据\(a, b\)我们可以将\(l\)分出四类来,然后我们对这四类分别讨论每一个\(l\)的长度从而求出回到原来位置的步数,也就是\(p × l = q × n*k\).

    int n, k;
    std::cin >> n >> k;
    std::vector<i64> l(4); // l的四种情况
    int a, b;
    std::cin >> a >> b;
    l[0] = b - a;
    l[1] = a + b;
    l[2] = -a - b + k;
    l[3] = a - b;
 
    i64 mn = std::numeric_limits<i64>::max();
    i64 mx = std::numeric_limits<i64>::min();
 
    for (int i = 0; i < 4; i++) {
        for (i64 j = l[i]; j <= 1ll * n * k; j += k) {
            if (j <= 0) continue;
            i64 p = std::__gcd(1ll * n * k, j);
            i64 ans = 1ll * n * k / p;
            mn = std::min(mn, ans);
            mx = std::max(mx, ans);
        }
    }
 
    std::cout << mn << " " << mx << "\n";
posted @ 2022-09-18 19:33  浅渊  阅读(15)  评论(0)    收藏  举报