20181107 模拟赛T1:快乐传递*正确版

问题描述

David 有很多好朋友。有些期末季刚结束,有些人很快乐,但有些不太快乐,David 想把快乐传递给每个人,作为心理学大师,他准备了如下计划:David 的朋友中有 n 个男生m 个女生, 还有 k 个跨性别者,方便起见,将他们分别编号为 0,...,n−1 和 0,...,m−1, 0,...,k −1,在第 i 天,David会邀请编号为 (i mod n) 的男生和编号为 (i mod m) 的女生还有 (i mod k)的跨性别者共进晚餐(因为 David 同时是程序员,所以从这个计划从第 0天开始) 。共进晚餐的三个人只要至少有有一个是快乐的人,另外的人也会变得快乐起来。否则大家的状态不会改变(一旦一个人是快乐的,他就会永远快乐下去) 。现在问题来了,David 想知道他是否能通过这个计划使得所有人都快乐起来呢?

输入格式

第一行一个整数 T ≤ 20,表示该测试点数据组数

每组数据的第一行包含三个整数 n,m,k, 保证至少一类人不为空

接下来一行第一个整数为 0 ≤ b ≤ n ,表示目前快乐的男生的数量,接下来
b 个空格隔开的整数 0 ≤ x i < n,表示快乐的男生的编号。

接下来一行第一个整数为 0 ≤ g ≤ m ,表示目前快乐的女生的数量,接下
来 g 个空格隔开的整数 0 ≤ y i < m,表示快乐的女生的编号。

接下来一行第一个整数为 0 ≤ t ≤ k ,表示目前快乐的跨性别者的数量,接
下来 t 个空格隔开的整数 0 ≤ z i < t,表示快乐的跨性别者的编号。

相邻两组数据之间有一行空行

输出格式

假如最终所有人都能变的快乐起来,就输出”Yes” (不带引号),否则输出”No”.

样例输入 1
3
2 3 0
0
1 0
0
2 4 0
1 0
1 2
0
2 3 0
1 0
1 1
0

样例输出 1

Yes
No
Yes

样例解释

对于第一组数据:
第 0 天,0 号男生和 0 号女生吃饭,因为 0 号女生是快乐的,所以 0 号男
生也变得快乐了;

第 1 天,1 号男生和 1 号女生吃饭,因为他们本来就都不快乐,情况没有变
化;

第 2 天,0 号男生和 2 号女生吃饭,因为 0 号男生是快乐的,所以 2 号女
生也变得快乐了;

第 3 天,1 号男生和 0 号女生吃饭,因为 0 号女生是快乐的,所以 1 号男
生也变得快乐了;

第 4 天,0 号男生和 1 号女生吃饭,因为 0 号男生是快乐的,所以 1 号女
生也变得快乐了;
这样就全都快乐了

对于第二组数据:1 号男生,1 号女生和 3 号女生永远也没法变得快乐

数据范围及约定

对于 50% 的数据,n,m ≤ 100,k = 0
对于 70% 的数据, n,m,k ≤ 2000
另外存在 10% 的数据, n,m ≤ 1000000000, b,g ≤ 100000,k = 0
对于 100% 的数据,n,m,k ≤ 1000000000, b,g,t ≤ 100000

// 70 fen baoli 
/*
	QAQ 这个70的baoli调了1h...然后就看见千古神犇 axm dalao的正解都写完了QAQ,在写暴力
	对拍,我好慌,偶然一撇看到了他把它们放到了一个数组里,于是我也把他们放到一个
	数组里,搞了好久一直不对。。放弃之际,决定再挣扎一下,然后..就调出来了,,但
	是写完第一题心态爆炸. (PS:大家可不要学我没事乱看哦QAQ)
*/
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
using namespace std;
const int N=1e6+10;

inline int read() {
	int n=0,f=1;char ch=getchar();
	while (ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while (ch<='9' && ch>='0') {n=(n<<3)+(n<<1)+ch-'0';ch=getchar();}
	return n*f;
}

inline void init() {
	freopen("happy2.in","r",stdin);
	freopen("happy2.out","w",stdout);
}

int x[N],y[N],z[N];
int T,n,m,k,b,a,c;

int main() {
	init();
	T=read();
	while (T--) {
		n=read(),m=read(),k=read();
		memset(x,0,sizeof(x));
		memset(y,0,sizeof(y));
		memset(z,0,sizeof(z));
		int aa=read();
		for(int i=1;i<=aa;++i) a=read(),x[a]=1;
		int ba=read();
		for(int i=1;i<=ba;++i) b=read(),y[b]=1;
		int ca=read();
		for(int i=1;i<=ca;++i) c=read(),z[c]=1;
		if(k) {
			for(int i=0;i<=100000;++i)
				if(y[i%m] || x[i%n] || z[i%k])
					y[i%m]=x[i%n]=z[i%k]=1;
			
		} else {
			for(int i=0;i<=100000;++i)
				if(y[i%m] || x[i%n]) y[i%m]=x[i%n]=1;
		}
		int bz=1;
		for(int i=0;i<n;++i)
			if(!x[i]) bz=0;
		for(int i=0;i<m;++i)
			if(!y[i]) bz=0;
		for(int i=0;i<k;++i)
			if(!z[i]) bz=0;
		if(bz==0) printf("No
");
		else printf("Yes
");
	}
	return 0;
}

std:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
using namespace std;
const long long inf=947483648;
const int N=1e5+10;

ll T,n,m,k;
ll a[N],b[N],cc[N],vis[N];	

inline ll read() {
	ll n=0,f=1;char ch=getchar();
	while (ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while (ch<='9' && ch>='0') {n=(n<<3)+(n<<1)+ch-'0';ch=getchar();}
	return n*f;
}

inline ll gcd(ll a,ll b) {
	if(b==0) return a;
	else return gcd(b,a%b);
}

inline void init() {
	freopen("happy2.in","r",stdin);
	freopen("happy2.out","w",stdout);
}
int main() {
	init();
	T=read();
	while (T--) {
		memset(vis,0,sizeof(vis));
		n=read(),m=read(),k=read();
		ll jc=gcd(gcd(n,m),k);
		ll a1,b1,c1;
		a1=read();
		for(ll i=0;i<a1;++i) vis[read()%jc]=1;
		b1=read();	
		for(ll i=0;i<b1;++i) vis[read()%jc]=1;
		c1=read();
		for(ll i=0;i<c1;++i) vis[read()%jc]=1;
		ll c=1;
		for(ll i=0;i<jc;++i) 
			if(!vis[i]) {
				c=0; break;
			}
		if(!c || a1+b1+c1==0) printf("No
");
		else printf("Yes
");
	}
	
	fclose(stdin); fclose(stdout);
	return 0;
}
原文地址:https://www.cnblogs.com/Darkpurple/p/9923966.html