- 给定一个圆,在上面选择(n)个点两两用线段相连,求最多能把蛋糕分成多少块。
- 数据组数(le20,nle64)
平面图欧拉公式
首先给出结论:
[F+V=E+2
]
其中(F)为分成平面数(包含外部平面),(V)为顶点数,(E)为边数。
考虑证明,我们任选出图中一棵生成树,边数为(V-1)。
然后我们构建该图的对偶图,不算生成树中的边。
由于我们选出的是生成树,肯定不会有平面被完全包围住,因此对偶图上所有点连通。而由于我们能选出一棵生成树,则对偶图中也不会有环,因此对偶图也是一棵生成树,边数为(F-1)。
因为原图和对偶图中的边加在一起就是所有边,因此((V-1)+(F-1)=E),即(V+F=E+2)。
在此题的应用
对于(V),在圆上本来就有(n)个点,而任意四点之间会产生一个交点(交点个数为(C_n^4))。因此(V=n+C_n^4)。
对于(E),在圆上本来就有(n)段圆弧,而任意两点之间会产生一条线段(初始线段个数为(C_n^2)),一个交点会把两条线段分成四条新增两条线段(新增线段个数为(2C_n^4))。因此(E=n+C_n^2+2C_n^4)。
所以,综上(F=E+2-V-1)(最后的减(1)是要减去外部平面),化简得到(1+C_n^2+C_n^4)。
代码:(O(T))
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
using namespace std;
int n;
int main()
{
W(~scanf("%d",&n)) printf("%d
",1+n*(n-1)/2+n*(n-1)*(n-2)*(n-3)/24);return 0;//平面图欧拉公式
}