题意:
一家商店里有A瓶饮料,有一个老逗逼每天白天都会来到商店,磕B瓶饮料,到了晚上,当商店老板发现店里的饮料少于C瓶时,就会购入D瓶。
现在这个老逗逼想知道能不能无限地嗑下去(即每天都能磕B瓶)。
分析:
首先,有几个显而易见的特判:
1、
,那么第一天就不够了
2、
,那么无论商店老板怎么补,都补不赢这个老逗逼磕的速度。
3、在上述条件都不满足的情况下,如果
,那么这个老逗逼永远不可能磕完。
现在考虑一下一般情况。
其实我们无非就是求
中
是否有解。
移一下项,变成了
是否有解。
这时就很简单了, 能够凑出的数必然是 的倍数。(学过拓欧的应该都知道)
无非就是求 中是否有 的倍数。
就是判断 而已,满足即可能喝完,不满足则不可能。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define SF scanf
#define PF printf
#define MAXN 100010
using namespace std;
typedef long long ll;
int n;
ll a,b,c,d;
ll gcd(ll x,ll y){
if(y==0)
return x;
return gcd(y,x%y);
}
int main(){
SF("%d",&n);
while(n--){
SF("%lld%lld%lld%lld",&a,&b,&c,&d);
if(a<b){
PF("No\n");
continue;
}
if(b>d){
PF("No\n");
continue;
}
if(c+1>=b){
PF("Yes\n");
continue;
}
ll g=gcd(b,d);
if((a-c-1ll)/g-(a-b)/g>0)
PF("No\n");
else
PF("Yes\n");
}
}