题目描述
对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。
例如,6 边形:
输入格式
输入只有一行一个整数n,代表边数。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入3 输出0
输入6 输出15
说明/提示
数据规模与约定
- 对于 50% 的数据,保证 3≤n≤100。
- 对于100% 的数据,保证 3≤n≤1e5。
思路:
- 首先,先来看一下对角线的求法:公式:n*(n-3)/2
原因:我们都知道对角线是由两个不相邻的顶点连线形成的,故有n*(n-3)中可能,但是会有重复,所以要除以2
- 其次,我们再来看这个对角线交点问题
首先,两条对角线形成一个交点,要有两条对角线就必须有一个四边形,即就是在n个顶点中找4个顶点的组合,我们高中都学过排列组合,即4!
所以就可套公式n*(n-1)*(n-2)*(n-3)/4!
(这个公式的由来:第一次可以从n个顶点中取,但第二次只能从n-1个顶点中取,以此类推...由于四个点的顺序不会改变这个四边形,所以要除以4!)
但是,这样在洛谷上会报错,因为n<=1e5,故这个式子n*(n-1)*(n-2)*(n-3)/4!直接爆long long,可以用这个巧妙转换:n*(n-1)*(n-2)*(n-3)/4!==n*(n-1)/2*(n-2)/3*(n-3)/4;
代码:
#include<stdio.h>
int main(void)
{
unsigned long long n,sum;
scanf("%lld",&n);
sum=n*(n-1)/2*(n-2)/3*(n-3)/4;
printf("%lld\n",sum);
return 0;
}