Educational Codeforces Round 77 (Rated for Div. 2) C. Infinite Fence

C. Infinite Fence

题目大意:给板子涂色,首先板子是顺序的,然后可以涂两种颜色,如果是r的倍数涂成红色,是b的倍数涂成蓝色,

连续的k个相同的颜色则不能完成任务,能完成任务则输出OBEY,否则输出REBEL

首先我们可以求b,r的gcd d=gcd(b,r)

然后b/=d,r/=d

然后让r<b  if(r>b) swap(b,r)

然后如果要连续k个板子颜色涂成r,则要占的长度是 len = r*(k-1)+1

如果这个长度len>b 则可以完成,否则不可以完成

这个原因应该很好理解,但是为什么b,r 要先处理一下都除以d呢?

这个是因为如果b,r 不互质,则它们有一个最大公约数,所以他们每走一步都是最大公约数的整数倍数

如果本来就互质,那么最大公约数就是1,如果不互质,那么这个最大公约数d,其实就相当于这个1

所以除以d 不会影响结果。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
#include <map>
#include <vector>
#define inf 0x3f3f3f3f-=
#define debug(x) cout<<"x = "<<x<<endl;
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        ll r,b,k;
        scanf("%lld%lld%lld",&r,&b,&k);
        ll d=gcd(r,b);
        r/=d,b/=d;
        if(r>b) swap(r,b);
        if(r*(k-1)+1<b) printf("REBEL
");
        else printf("OBEY
");
    }
}
View Code
原文地址:https://www.cnblogs.com/EchoZQN/p/11979482.html