Educational Codeforces Round 77

Educational Codeforces Round 77

C.Infinite Fence

  • 题意:现有 $ 10^{100}$ 块木板需要涂漆,第 \(x\) 块如果 \(x\)\(r\) 的倍数,则涂上红色,是 \(b\) 的倍数,则涂蓝色。如果既是 \(r\) 又是 \(b\) 的倍数,那么两种颜色都可以涂;如果连续有 \(k​\) 块板的颜色是一样的,则输出REBEL,否则输出OBEY。问是否能避免被处死.

  • 分析:

  • 若规定 \(r<b\) ,一开始就很简单的以为只要 \(b \ge k \times r​\) 就可以。主要是错误地理解所有间隔都是固定的,等于开头的间隔,其实间隔是会变化的。

  • 对于这种有一定数学规律的题,不要一直去想具体的例子。

  • 抽象出 \(nb........(n+1)b\) 的一段,为满足题意,它们中间 \(b-1\) 的距离最多只能放 \(k-1\) 个红色木板。故设第k个红木板相对 \(nb\) 的距离为 \(d_{k}​\)

    \[d_{k}>b-1 \\ \ \\ t+(k-1) \times r >b-1\\ \ \\k>\frac{(b-1)-t}{r}+1 \]

    所以只要满足(3)式就输出OBEY

  • 求t:t是第一个红木板相对 \(nb\) 的距离。有如下关系

    \[n_{1}b+t=n_{2}r \]

    当t最小时,\(d_{k}\) 也最小,是最坏的情况。根据exgcd,当 \(gcd(r,b) | t\) 时有解,t最小值为 \(gcd(r,b)\)

  • 代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int MA=1e5+5;
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--){
            ll r,b,k;
            scanf("%lld%lld%lld",&r,&b,&k);
            if(r>b) swap(r,b);
            ll g=__gcd(r,b);
            ll ans=((b-1)-g)/r+1;
            if(k<=ans) printf("REBEL\n");
            else printf("OBEY\n");
        }
        return 0;
    }
    
    
posted @ 2020-01-09 17:13  A_sc  阅读(101)  评论(0编辑  收藏  举报