题面
有一个长度为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");
}