题目链接
有\(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";
标签:std,走多远,Beatles,CF1143D,int,numeric,i64,数学
From: https://www.cnblogs.com/Haven-/p/16705558.html