Codeforces 1260C Infinite Fence(扩展欧几里得有解的条件)

思路:

1.此题的1010010^{100}我们可以将它当成正无穷,我们设x=min(r,b)x=min(r,b)y=max(r,b)y=max(r,b),由于重复的部分我们可以涂任意颜色,因此我们需要做的就是讨论在yy的两个倍数之间可不可以夹kkkk个以上的xx的倍数;
2.我们设在mymy(m+1)y(m+1)y这段区间内(即[my+1,my+2,...,my+y1][my+1,my+2,...,my+y-1])可以含有最多的xx的倍数,根据贪心的思想,我们希望xx的倍数第一次应该出现在my+1my+1,但是这需要(my+1)modx=0(my+1)modx=0;根据扩展欧几里得算法有解的条件,我们可以得知在这段区间内,xx的倍数最早第一次出现的位置应该在my+gcd(x,y)my+gcd(x,y),得知最早第一次出现的位置,我们就可以计算整个区间内xx的倍数出现的最多次数了~,然后和kk做比较即可;

代码:

#define IOS ios::sync_with_stdio(false);cin.tie(0)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int main(){
	int t; cin>>t;
	while(t--){
		LL r,b,k;
		cin>>r>>b>>k;
		LL x=min(r,b),y=max(r,b);
		LL g=gcd(x,y); 
		if(((y-1)/x+((y-1)%x>=g?1:0))>=k) puts("REBEL");
		else puts("OBEY");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308806.html