http://codeforces.com/contest/1260/problem/C
题意:
t次询问,每次给你3个数,a,b,k
有无穷个木板,需要为木板涂色,所有a的倍数(加上0)都涂成红色,所有b的倍数(加上0)都涂成绿色,假如一个木板既可以被涂成红色也可以被涂成绿色,那么可以随便涂一种颜色。
问:
从木板0开始,在所有涂了色的木板中,假如连续使用同一种颜色涂大于等于k次,则输出REBEL,否则输出OBEY
首先假设a,b中较大的数为a,那么所有a的倍数一定都涂成红色。
问题主要是解决在红色木板的间隔中最多有多少块木板会被涂成绿色,假如有大于等于k个木板会被涂成绿色,则输出REBEL
那么问题来了,要在a的间隔中计算b究竟最多能涂多少块木板,应该将b0的开始尽可能的往前挪,那么挪到什么时候是b0可能的最左端呢?
a0+1吗? 并不是
答案是a0+gcd(a,b)
简略证明:
假设 : d=gcd(a,b) , 则再设 : a=xd , b=yd (x>=y) ,
b-a = (y-x)d , 因为y和x都是整数,所以y-x=0,1,2,3……
假如x!=y,那么b-a的最小值是d
证毕(我也不知道这样证可不可以)
程序:
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
const int INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) {return b ? gcd(b, a%b) : a;
}
int main() {ll n; cin >> n;while (n--) {ll a, b, k;cin >> a >> b >> k;if (k == 1) {cout << "REBEL" << endl;continue;}if (a < b)swap(a, b); //默认a更大ll d = gcd(a, b);//从gcd开始,最多涂k-1块木板是相同颜色的 if (d + b * (k - 1) < a) cout << "REBEL" << endl;elsecout << "OBEY" << endl;}return 0;
}