题意:给出$N$,试构造一个点数小于$500$的图,使得其中三元环的个数恰好为$N$。$N \leq 2 \times 10^6$
首先构造一个尽可能大的完全图,然后在这个完全图旁边加点、尽可能多的连边即可。这种方法不一定是最优的,但是是较优的
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool edge[510][510]; 5 int N , cnt; 6 7 int main(){ 8 cin >> N; 9 for(int i = 500 ; i ; i--) 10 if(i * (i - 1) * (i - 2) / 6 <= N){ 11 N -= i * (i - 1) * (i - 2) / 6; 12 cnt = i; 13 for(int i = 1 ; i <= cnt ; i++) 14 for(int j = 1 ; j + i <= cnt ; j++) 15 edge[i][j] = 1; 16 break; 17 } 18 for(int j = 500 ; j && N ; j--) 19 if(j * (j - 1) / 2 <= N){ 20 N -= j * (j - 1) / 2; 21 cnt++; 22 for(int i = 1 ; i <= j ; i++) 23 edge[i][cnt - i] = 1; 24 j++; 25 } 26 cout << cnt << endl; 27 for(int i = 1 ; i <= cnt ; i++){ 28 for(int j = 1 ; j + i <= cnt ; j++){ 29 putchar(edge[i][j] + 48); 30 putchar(' '); 31 } 32 putchar('\n'); 33 } 34 return 0; 35 }