题目翻译
给定 $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;
}