牛客小白月赛5F圆的公式推导 组合数 欧拉公式

题目大意
一个圆上有n个点,在n个点中间两两连边,求最多产生多少个区域?
视频讲解:
3B1B视频讲解
力推3B1B视频
思路:
首先在圆上去n个点,
要是n个点产生的区域数最大,
就必须是任意3条直线不交于一点。
也就是园内任意一点最多只有两条直线经过。
在圆上的n个点会连出C(n,2)条直线。
任意一个圆内交点都可以有圆上四点构成的四元组唯一对应,
那么无序四元组的个数为C(n,4),也是交点个数。
如果把圆看成一张图(圆弧也是边),
点由直线交点和圆上的点构成,
直线交点数量为C(n,4),圆上交点数量为n。
那么点数有n+C(n,4)。
边由圆弧和直线上被交点分割成的若干小段构成,
圆弧数量为n,
有n条直线,m个交点。
考虑每增加一个交点,就会产生新边数量为2(自己画图YY一下)
原来有n条直线,有n条边,
每有一个交点,就会使其中两条直线上的边数加2,
m个交点,就加了2m条边,所以总共n+2m条边。
被分割成的若干边的数量为C(n,2)+2C(n,4)。
边数有C(n,2)+2C(n,4)+n。
根据欧拉公式F-E+V=2(二维和三维一样适用)有
F:面数(区域数)E:边数 V:点数
E=C(n,2)+2C(n,4)+n
V=n+C(n,4)。
F=E-V+2
=C(n,4)+C(n,2)+2
扣掉圆外区域
答案为C(n,4)+C(n,2)+1
复杂度 O(1)
内容板块
数学:组合数
图论:欧拉公式
#include<cstdio>
#include<algorithm>
#include<iostream>
int n;
int main(){
    while(~scanf("%d",&n))
        cout<<1+1ll*n*(n-1)/2+1ll*n*(n-1)/2*(n-2)/3*(n-3)/4<<endl;
    return 0;
}

全部评论
大佬,边数公式:C(n,2)+2C(n,4)+n,求解释下2C(n,4)怎么得到的
点赞 回复 分享
发布于 2018-07-26 07:42
这个是以前做过的原题吗,我怎么记得这个公式有点眼熟啊
点赞 回复 分享
发布于 2018-12-16 12:23

相关推荐

11-13 14:37
门头沟学院 Java
程序员牛肉:是的,我觉得你最先需要的是多接触计算机圈子。我感觉你这个写的太幼稚了,根本没换位思考面试官。 你对实习的描述还是我写了前后端,我写了Restful接口,我用了EChatrs。你这让面试官怎么问你?问你什么是前后端?问你什么是Restful?讲真的兄弟,你这个简历在面试官眼里就是啥也不懂的好学生。所以一定要尽快加入一个圈子跟大家多聊聊,看看正儿八经的简历是怎么写的。 可以看一下我首页的简历怎么写那篇文章来学一下,你这里面的坑点我那篇文章里面都有讲过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务