题目翻译

给定 $a,b,c,d$,重复执行 $a\gets a-b$。但是操作完后如果 $a\leq c$ 将会执行 $a\gets a+d$,问是否可以保证 $a\gt 0$ 的情况喜爱无限次执行。

多测,$1\leq t\leq 300,1\leq a,b,c,d\leq 10^{18}$。

题目思路

特殊情况是 $a\lt b$ 表示第一天买完了,$d\lt b$ 表示你加的没有要的多,都是不合法的情况。

那么我们判掉之后就成了 $a\geq b\operatorname{and} d\geq b$。

设买了 $x$ 次,加了 $y$ 次,此时我们就是在找是否有解满足 $c\lt a-bx+dy\lt b$,表示我们现在可以到 $\gt c$ 但是加不到 $\geq b$。如果存在就说明可以被买完。

又因为 $bx-dy=k\times \gcd(b,d)$,所以就是在问是否存在这样的 $k$ 使得 $c\lt a-k\times \gcd(a,b)\lt b$,移项得到 $a-b\lt k\times \gcd(a,b)\lt a-c$。

这个是很好判断的,那么就做完了。

完整代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
    ll a, b, c, d;
    cin >> a >> b >> c >> d;
    if (min(a, d) < b)
        return puts("No"), void();
    ll g = __gcd(b, d);
    puts((a - c - 1) / g <= (a - b) / g ? "Yes" : "No");
}
int main()
{
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}
最后修改:2024 年 02 月 25 日
v我50吃疯狂星期四