Luogu P8348

构造题。

……

这玩意儿怎么构造。

不过只用判断 Yes/No 。

考虑找一个方法唯一的表示一对数能表示的拓展出的序列包含的所有“一对数”。
容易想到一直减到最小,用最终结果表示。
由于使用一次加法后可以使用两次减法抵消,而最终结果一定是一直减的,所以不用考虑加法。

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
int T,A,B,x,y,k;
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d%d%d",&A,&B,&x,&y,&k);
		if(A<k || B<k || x<k || y<k){
			printf("no\n");
			continue;
		}
		int a1=A,b1=B,a2=y,b2=x;
		for(;abs(a1-b1)>=k;){
			if(a1-2*b1>=k)a1=(a1%(b1*2)<k?a1%(b1*2)+b1*2:a1%(b1*2));
			else{
				int c=abs(a1-b1);
				a1=b1;b1=c;
			}
		}
		for(;abs(a2-b2)>=k;){
			if(a2-2*b2>=k)a2=(a2%(b2*2)<k?a2%(b2*2)+b2*2:a2%(b2*2));
			else{
				int c=abs(a2-b2);
				a2=b2;b2=c;
			}
		}
		if(a1==b2 && b1==a2)printf("yes\n");
		else printf("no\n");
	}

	return 0;
}
posted @ 2022-10-22 15:16  Kelvin2005  阅读(28)  评论(0)    收藏  举报