CF1492A Three swimmers 题解
Update
- \(\texttt{2021.3.9}\) 修改了题解中的错别字。
- \(\texttt{2021.12.16}\) 修改了一个没括回的区间。
Content
有 \(3\) 个游泳者,同时在 \(0\) 秒从起点出发,第一个游泳者每 \(a\) 秒游一个来回,第二个游泳者每 \(b\) 秒游一个来回,第三个游泳者每 \(c\) 秒游一个来回。
你在第 \(p\) 秒开始来到起点观看他们的游泳比赛,你想知道从第 \(p\) 秒开始到你看到的第一个人重新游回起点时经过的时间。
数据范围:\(t\) 组数据,\(t\in[1,10^3]\),\(p,a,b,c\in[1,10^{18}]\)。
Solution
一看到 \(p,a,b,c\) 的数据范围这么大,我们就考虑是否有 \(\mathcal{O}(1)\) 的做法。而想法也很简单:
- 如果 \(p\) 能够被 \(a,b,c\) 三个数当中的任意一个整除,那么答案是 \(0\),因为你一到起点就会看到有人游到终点。
- 否则:第一个游泳者还需要 \(a-p\bmod a\) 秒到达起点,第二个游泳者还需要 \(b-p\bmod b\) 秒到达起点,第三个游泳者还需要 \(c-p\bmod c\) 秒到达起点。故答案为 \(\min(a-p\bmod a,b-p\bmod b,c-p\bmod c)\)。
Code
ll p, a, b, c;
int main() {
MT {
p = Rll, a = Rll, b = Rll, c = Rll;
if(!(p % a) || !(p % b) || !(p % c)) puts("0");
else printf("%lld\n", min(a - p % a, min(b - p % b, c - p % c)));
}
return 0;
}