Codeforces 1166E(思维)

题面

有一个长度为n的序列a,有m次操作。每一次操作一个人选a的一个子集x,另一个人会选x的补集y.且x集合中的数的最小公倍数比y集合中的数的最小公倍数大。现在给出所有x,判断是否有一个序列a满足条件。

分析

考虑不满足条件的情况:假如子集(x_i)(x_j)完全不相交,会出现矛盾

因为(gcd(x_i)>gcd(a-x_i),gcd(x_j)>gcd(a-x_j)),我们又知道(x_j=a-x_i),因此上式可以化为(gcd(x_i)>gcd(x_j),gcd(x_j)>gcd(x,y)),矛盾

代码

#include<iostream>
#include<cstdio>
#define maxm 55
#define maxn 10005
using namespace std;
int m,n;
int a[maxm][maxn];
int main() {
	int sz,x;
	scanf("%d %d",&m,&n);
	for(int i=1; i<=m; i++) {
		scanf("%d",&sz);
		for(int j=1; j<=sz; j++) {
			scanf("%d",&x);
			a[i][x]=1;
		}
	}
	for(int i=1; i<=m; i++) {
		for(int j=1; j<=m; j++) {
			bool flag=true;
			for(int k=1; k<=n; k++) {
				if(a[i][k]==1&&a[j][k]==1) {
					flag=false;
				}
			}
			if(flag) {
				printf("impossible
");
				return 0;
			}
		}
	}
	printf("possible");
}

原文地址:https://www.cnblogs.com/birchtree/p/10888275.html