CF1166E(思维)

题面

有一个长度为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\n");
                return 0;
            }
        }
    }
    printf("possible");
}

猜你喜欢

转载自www.cnblogs.com/birchtree/p/10888275.html