emmm…
这道题mayflyyh拿给我做的时候只会判有解无解…然后第二天下午突然想到可以直接放进去。
首先来讨论一下有解无解的情况 。
我们将集合视为点,公共元素作为边,转化为无向图,就成了
条边完全图,所以由完全图的性质,若存在
满足下式则有解,否则无解
然后考虑放集合。
我们暴力将每个数放进集合中满足条件即可,看代码理解一下就好了…
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
int n,m,cnt;
vector<int>a[1000];
int main() {
scanf("%d",&n);
for(int i=1;i*(i-1)<=2*n;i++) if(i*(i-1)==n*2) m=i;
if(!m) {
puts("No");return 0;
}
puts("Yes");printf("%d\n",m);
for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++) cnt++,a[i].pb(cnt),a[j].pb(cnt);
for(int i=1;i<=m;i++) {
printf("%d ",a[i].size());
for(int j=0;j<a[i].size();j++) printf("%d ",a[i][j]);puts("");
}
return 0;
}