Luogu5441
有 (n) 个点 ( (n) 为奇数 , (n le 99) ) 的完全图 , 其中可以有最多 (n) 条无向边 , 其他都是有向边 . 如果对于某四个点不经过这四个点以外的点能够相互到达 , 则构成一组合法方案 . 现在需要输出一种构图方法 , 使得合法方案数最大 .
输出格式 : 最大方案数 ; 一个邻接矩阵 : (f[i][j]=0/1) 表示能否从 (i) 到 (j) .
洛谷原题解
想办法算出最少的不合法的方案数 , 观察发现 ,对于四个点不是强连通的只有三种情况 :
对于第三种情况不好算 , 考虑计算第一种情况 , 前两种情况本质是一样的 .
想了半天这道题完全是在乱搞骗分 , 没有证明什么第三种情况不是更优的 , 但还是把官方题解摆出来 , 就当涨涨见识吧 .
设 (s[i]) 表示i连出的有向边 . 则 (ans = sum C_{s[i]}^3) , 且有 (sum s[i] = frac{n(n-1)}{2}-n =nfrac{n-3}{2}) (因为 (n) 是奇数)
对于函数 (C_x^3 = frac{x(x-1)(x-2)}{6}) , 在 $ x ge 3$ 时是凸函数 .
对于凸函数有一个性质: (f(a)+f(b) ge 2f(frac{a+b}{2})) 可以猜想出 (f(a)+f(b)+f(c) ge 3f(frac{a+b+c}{3})) ,
进一步猜想出对于 (n) 个数有 (f(a_1) + dots + f(a_n) ge nf(frac{a_1+dots+a_n}{n})) . (这题要用到 , 我只会打表证明)
所以 (ans >= n imes C_{frac{n-3}{2}}^3) . 这样方案数就可以直接算出来 (C_{n}^{4} - n imes C_{frac{n - 3}{2}}^{3} = frac{n(n-3)(n^2+6n-31)}{48})
关于构造方案 : 所有最长的对角线 ( 一共有 (n) 条 ) 是无向边 , 每个点向顺时针的 (frac{n-3}{2}) 个点连有向边 .
(dots) 写不下去了我觉得这是错的 , 为什么 (spj) 跑出来是对的 ? 算了就当长见识到这里吧 .
原题 : 高中奥数教程(小蓝本)图论P73 , 作为数学题来说还是道好题的 .
可能这就是信息选手不严谨的乱搞骗分吧 .
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
if (n == 1) {
cout << 0 << endl << 0 << endl;
return 0;
}
cout << n * (n - 3) * (n * n + 6 * n - 31) / 48 << endl;
int m = (n + 1) >> 1;
for (int i = 1; i <= n; i++) {
int a[n+1];
memset(a, 0, sizeof(a));
for (int j = 1; j <= m; j++)
a[(i+j-1)%n+1] = 1;
for (int j = 1; j < n; j++) cout << a[j] << " ";
cout << a[n] << endl;
}
return 0;
}