题目链接:http://codeforces.com/contest/233/problem/C
题意是给一个数字k,让我们构造出一个无向图,这个无向图里恰好有k个三元环。输出顶点数然后以邻接矩阵的方式输出这幅图,顶点数必须小于100.
每日一题里的题目,终于有一道简单能写的了。一副n个顶点的完全图G,其三元环的个数是C(3,n)个,然后如果现在再有一个点,然后给这个点向图G连两条边,那么三元环数多1,再加一条边多,答案增加2,再加,答案增加3。如果超过k时,再添加一个新点,然后重复上述步骤,这样去迭代就行。
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<time.h>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<iostream>
using namespace std;
#define LONG long long
const int INF=0x3f3f3f3f;
const LONG MOD=1e9+61;
const double PI=acos(-1.0);
#define clrI(x) memset(x,-1,sizeof(x))
#define clr0(x) memset(x,0,sizeof x)
#define clr1(x) memset(x,INF,sizeof x)
#define clr2(x) memset(x,-INF,sizeof x)
#define EPS 1e-10
int C[120];
int A[120] ;
int p = 0;
int Map[120][120];
void dfs(int k )
{
if(k == 0)return ;
for(int i = 1 ; i <= 100 ;++ i)
{
if(k < i)
{
A[++p] = i ;
break ;
}
k -= i ;
}
dfs(k) ;
}
int main()
{
for(int i = 3 ; i <= 100 ;++ i)
C[i] = i * ( i - 1) * (i-2)/6;
int k ;
clr0(Map);
cin>>k ;
int res = 0;
for(int i = 3 ; i<=100 ;++ i)
if(k<C[i])
{
k -= C[i-1];
res = i-1;
break;
}
dfs(k) ;
int n = res + p;
for(int i = 1; i <= res ; ++ i)
for(int j = i + 1; j<=res ; ++ j)Map[i][j] = 1,Map[j][i] = 1;
for(int i = res + 1; i <= res + p ; ++ i)
for(int j = 1 ; j <= A[i-res ] ; ++ j)Map[i ][j] = 1,Map[j][i] =1 ;
cout<<n<<endl;
for(int i =1; i<=n ; ++ i)
{
for(int j = 1; j<=n ;++ j)printf("%d",Map[i][j]);cout<<endl;
}
}