• [题解] LuoguP6476 [NOI Online 2 提高组]涂色游戏


    https://www.luogu.com.cn/problem/P6476

    估计这是窝唯一能过的题了......

    建议手画几张图,窝太懒了就不画了......

    讲一下考场上的思路吧(可能会有一些没用的东西)...

    首先先想到一个(lcm)刚好是一个循环,然后只需要考虑(lcm)以内的就好了。

    设给的两个数为(p,q)(默认(p<q)),贪心的想,窝只用考虑(p)的倍数是否组成连续(k)个同颜色的块就可以了。

    那么显然对于(q)跳出来的一段,往里面塞(p),也就是对于所有(q)的倍数都标上蓝色,其他(p)的倍数都标上红色((0)也标上蓝色)。

    那么就变成了(q)跳出来的一段内最多塞了多少(p),刚开始的想法就是直接考虑([0,q])内有多少(p)的倍数(不算(0)(q)),这显然是((q-1)/p)的。

    然后按这样写就能过第一个样例了。

    但是

    发现第二个样例萎了......

    后来想到应为按上面的方法,第一段并没有把(0)算上去,可以画一下(p=2,q=11)的图,第二段中红色的点就比第一段中的多。

    也就是会有错位的部分,那么窝令最小错位能错(g)个位置(这样一段内红色的是最多的)

    也就是(px-qy=g),发现(g)最小为(gcd(p,q)),也对这一段算一下有多少红色就好了。

    还有就是注意一些特判...

    考场代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    
    ll gcd(ll x, ll y) { return y ? gcd(y,x%y) : x; }
    
    inline bool chk(ll p, ll q, ll k) {
      if (p>q) swap(p,q);
      if (k == 1) return false;
      if (p == q) return true;
      ll g = gcd(p,q);
      return (q-1)/p < k && (q-1-g)/p+1 < k;
    }
    
    int main() {
    //  freopen("color.in", "r", stdin);
    //  freopen("color.out", "w", stdout);
      int T; for (scanf("%d", &T); T; T--) {
        ll p, q, k; scanf("%lld%lld%lld", &p, &q, &k);
        puts(chk(p,q,k) ? "Yes" : "No");
      }
      return 0;
    }
    
  • 相关阅读:
    ASP.NET MVC CheckBoxFor的int to bool
    ASP.NET MVC jQuery 树插件在项目中使用方法(一)
    ASP.NET MVC Select无限级分类选择下拉框
    ASP.NET MVC 处理404与500错误页面的方法
    使用Angularjs开发Web App 视频课程 --麦子学院课程
    NEVER QUIT. NEVER SAY NEVER.
    夏天那么短,思念却很长
    不要瞧不起别人的生活,他人也在用你看不见的方式努力
    Windows 10 安装 到SSD硬盘
    12.23daily_scrum
  • 原文地址:https://www.cnblogs.com/wxq1229/p/12773116.html
Copyright © 2020-2023  润新知