C. Infinite Fence(数学,最小余数)

传送门大门小门中门啊大家我

\(对于给定的r,b\)

\(为了方便,设r<=b\)

\(如果有k个块颜色相同\)

\(那么一定是在某个[kb,(k+1)b]间连续有k个r的倍数\)

\(因为一旦是b的倍数,就可以取不同的颜色,就达不到目的了.\)

\(\color{Orange}{于是,我们最少需要(k-1)*r+1的区间长度来构造}\)

\(但是出现b的倍数后,下一个出现的a的倍数位置不确定,我们能用的区间长度就不确定\)

\(我们希望找一个a的倍数,尽量少的大于那个b的倍数,这样可用区间长就最多\)

\(\color{Red}{举个例子: 5 \ 8\ 2 }\)

\(我们最少需要(2-1)*5+1的区间长度来构造\)

\(然后我们发现25和24离得最近是1,那么可用区间就是32-25=7\)

\(那么其实这个a倍数-b倍数的最小值就是gcd(r,b)\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll r,b,k;
ll gcd(ll a,ll b){
	return b==0?a:gcd(b,a%b);
}
int main()
{
	int t;cin>>t;
	while(t--)
	{
		cin>>r>>b>>k;
		//预期不可行,发现可行 
		ll last=gcd(r,b);
		ll empty=max(r,b)-last;//有这么大的空位
		ll need=(k-1)*min(r,b)+1;//需要这么大
		if(empty>=need)	cout<<"REBEL";
		else	cout<<"OBEY";
		cout<<endl; 
	}
}

猜你喜欢

转载自www.cnblogs.com/iss-ue/p/12895245.html