正题
题目链接:https://www.luogu.com.cn/problem/CF1260C
题目大意
无数个栏杆,rrr的倍数染成红色,bbb的倍数染成蓝色,是rrr和bbb的倍数的话可以选择一个染色,去掉没有染色的,是否有一种方案使得最长的染色快不超过kkk个。
解题思路
显然在rrr和bbb的最小公倍数左右两种颜色是一样的,所以只需要考虑每个公倍数为一段之间的最长连续色块。
假设r>br>br>b,我们计算最长色块,显然边上的色块长度是r/br/br/b。
先将rrr和bbb除于最小公因数ggg,考虑计算中间的,因为无限延伸,总会有一种情况使得一个蓝色块搞好在红色块的后第ggg个位置,那么此时是中间最长的,长度为(r−2)/b+1(r-2)/b+1(r−2)/b+1
所以判断即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll T,a,b,k;
ll gcd(ll x,ll y){if(!y) return x;return gcd(y,x%y);
}
int main()
{//freopen("color.in","r",stdin);//freopen("color.out","w",stdout);scanf("%lld",&T);while(T--){scanf("%lld%lld%lld",&a,&b,&k);if(k==1){printf("REBEL\n");continue;}if(a<b)swap(a,b);ll g=gcd(a,b);a/=g;b/=g;if(a==1&&b==1)printf("OBEY\n");else if(b==1){if(a-b>=k)printf("REBEL\n");else printf("OBEY\n");}else{ll c=(a-2)/b+1,z=a/b;if(c>=k||z>=k) printf("REBEL\n");else printf("OBEY\n");}}
}