• [NOI Online #2 提高组]color(数学)


    这道题就不讲每一档部分分怎么拿了,因为我考试的时候也没想。

    我们发现如果$k=1$直接输出No就行了,先特判一下。

    我们先不妨设$(p_1,p_2)=1$,因为如果$(p_1, p_2) eq 1$,同时对$p_1, p_2$除以$(p_1, p_2)$效果不变。

    再不妨设$p_1<p_2$,最坏情况就是在$[qp_2 + 1, (q+1)p_2 - 1]$里大于等于$k$个$p_1$。

    而最坏情况就是$qp_2+1$是$p_1$的倍数,即$rp_1=qp_2+1$。

    而如果要输出No,则$(r+k-1)p_1 leq (q+1)p_2 - 1$,化简的$(k-1)p_1+1<p_2$。

    所以若上述式子满足,则输出No,否则输出Yes。

    #include <iostream>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    ll t, p1, p2, k;
    ll gcd(ll a, ll b) {
        return b == 0 ? a : gcd(b, a % b);
    }
    ll read() {
        ll ret = 0, f = 1;
        char ch = getchar();
        while ('0' > ch || ch > '9'){
            if (ch == '-') f = -1;
            ch = getchar();
        }
        while ('0' <= ch && ch <= '9') {
            ret = (ret << 1) + (ret << 3) + ch - '0';
            ch = getchar();
        }
        return ret * f;
    }
    int main() {
    //    freopen("color.in", "r", stdin);
    //    freopen("color.out", "w", stdout);
        t = read();
        while (t--) {
            p1 = read();
            p2 = read();
            k = read();
            if (k == 1) {
                puts("No");
                continue;
            }
            ll g = gcd(p1, p2);
            p1 /= g;
            p2 /= g;
            if (p1 > p2) swap(p1, p2);
            if (p1 * (k - 1) + 1 < p2) puts("No");
            else puts("Yes");
        }
        return 0;
    }

    不加快读估计会T。

  • 相关阅读:
    菜鸟解决“子页面关闭刷新父页面局部”问题的历程
    ORACLE基本SQL语句-查询篇
    ORACLE基本SQL语句-添加更新数据函数篇
    ORACLE基本SQL语句-用户及建表篇
    关于JVM
    调用微信支付接口总结
    Oracle入门
    C#使用 SharpAVI进行 屏幕录制
    window 下编译cef 内核 加入mp3/mp4 支持
    python 模块 optparse
  • 原文地址:https://www.cnblogs.com/zcr-blog/p/12779595.html
Copyright © 2020-2023  润新知