题目链接:https://vjudge.net/contest/349801#problem/A
参考文章:https://blog.csdn.net/xs18952904/article/details/90338776
题目:
输入m,n(n表示一个序列ai,长度为n),接下来m行,每行一个si表示这行要输入的数字的个数然后si个数字,
这si个数字的LCM(选中的si个数字) > LCM(ai序列中剩余的n-si个数字)。
判断是否存在这个ai序列。
思路:
假设两个si,sj两个集合不相交,则LCM(si) > LCM(n-si),LCM(sj) > LCM(n-sj)。
但是如果LCM(si) > LCM(n-si)成立,则LCM(sj) > LCM(n-sj)一定不成立;
因为sj是n-si的子集,所以两个结论冲突。
扩展到一般情况,就是只有任意两个si都有交集,ai序列才存在。
代码:
#include <bits/stdc++.h>
using namespace std;
bool a[52][10005] = {false};
int main(void)
{
int m,n,x,y;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
for(int j=1;j<=x;j++)
{
scanf("%d",&y);
a[i][y] = true;
}
}
for(int i=1;i<=m;i++)
{
for(int j=i+1;j<=m;j++)
{
bool fg = false;
for(int k=1;k<=n;k++)
if(a[i][k] == true && a[j][k] == true)
{
fg = true;break;
}
if(fg == false)
{
printf("impossible\n");
return 0;
}
}
}
printf("possible\n");
return 0;
}