【数学】AtCoder Grand Contest 026 rng_10s

题意:

一家商店里有A瓶饮料,有一个老逗逼每天白天都会来到商店,磕B瓶饮料,到了晚上,当商店老板发现店里的饮料少于C瓶时,就会购入D瓶。
现在这个老逗逼想知道能不能无限地嗑下去(即每天都能磕B瓶)。


分析:

首先,有几个显而易见的特判:
1、 A < B ,那么第一天就不够了
2、 D < B ,那么无论商店老板怎么补,都补不赢这个老逗逼磕的速度。
3、在上述条件都不满足的情况下,如果 C + 1 B ,那么这个老逗逼永远不可能磕完。

现在考虑一下一般情况。
其实我们无非就是求
B < A x × B + y × D < C x , y 是否有解。

移一下项,变成了
A C < x × B y × D < A B 是否有解。

这时就很简单了, x × B y × D 能够凑出的数必然是 g c d ( B , D ) 的倍数。(学过拓欧的应该都知道)

无非就是求 ( A C , A B ) 中是否有 g c d ( B , D ) 的倍数。

就是判断 A B 1 g c d ( B , D ) A C g c d ( B , D ) 0 而已,满足即可能喝完,不满足则不可能。

#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");
    }
} 

猜你喜欢

转载自blog.csdn.net/qq_34454069/article/details/81055250