题目描述
小L计划进行n场游戏,每场游戏使用一张地图,小 L 会同时使用三辆车在该地图上完成游戏。
小 L 的赛车有三辆,分别用大写字母 A、B、C 表示。地图是一张无向简单图(没有重边或自环),每次他会在地图中选择不同的三个点 i,j,k满足\(i<j<k\)且两两之间均有边。此时他会让 A 从i到j,B 从j到k,C从k到i,完成一场游戏。他记得有一张地图使得他恰好能完成n场不同的游戏,且这个地图顶点数不超过500,请你帮他找到这张地图。
有时候小L会记得地图的一些特点,他会把这些告诉你以帮助你找到地图。
也就是说,给一个正整数n,请你构造一个无向简单图使得其三元环个数为n。
说实话这个题一看以为是什么高深的玩意,完全看不出是NOIP的难度
做这个题的时候,各位神犇需要做的就是,把之前学的各种算法,数据结构全忘了QAQ蒟蒻的搜索T到飞起
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define re register
#define ll long long
#define gc getchar()
inline int read()
{
re int x(0),f(1);re char c(gc);
while(c>'9'||c<'0')f=c=='-'?-1:1,c=gc;
while(c>='0'&&c<='9')x=x*10+c-48,c=gc;
return f*x;
}
const int N=505;
int f[N][N],a[N],b[N],c[N],n;
int main()
{
n=read();
int i,tot;
for(tot=1;n;tot++)
{
for(i=1;i<tot&&i*(i-1)/2<=n;i++)
f[i][tot]=1;
n-=(i-1)*(i-2)/2;
}
cout<<tot<<endl;
for(i=1;i<tot;i++)
{
for(int j=i+1;j<=tot;j++)
cout<<(f[i][j]|f[j][i])<<" ";
cout<<endl;
}
return 0;
}