【今日逼逼】
这题有点偏技巧性了,如果知道那个公式的话,可能代码量会少一点。
P2181 对角线
题目如下:
题目描述
对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。
例如,6边形:
输入格式
输入只有一行一个整数 n,代表边数。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入 #1
3
输出 #1
0
输入 #2
6
输出 #2
15
说明/提示
数据规模与约定
对于 50% 的数据,保证3≤n≤100
对于 100% 的数据,保证3≤n≤10^5
源代码:
#include<stdio.h>
int main()
{
unsigned long long N;
scanf("%d",&N);
printf("%lld",N*(N-1)/2*(N-2)/3*(N-3)/4);
return 0;
}
程序运行图:
这道题有一个公式: n (n-1) (n-2) (n-3) / 24
但是在运行的时候最好写成 N*(N-1)/2*(N-2)/3*(N-3)/4这种形式,不然即使用unsigned long long 也会超出范围。
注意:因为n和n-1一定有一个是2的倍数,所以2可以除尽;同理,n、n-1、n-2中一定有一个是3的倍数,所以3也可以除尽;
同理4也可以除尽。
其次,关于这个公式如何推导:
首先由题目意思得:
不会有三条对角线交于一点,所以过某一个交点有且只能有2条对角线,而这两条对角线实质上是确定了4个顶点(也可以看做是一个四边形的两条对角线交于一点,求四边形的数量)。
因此我们只需要确定4个顶点就得到了这个唯一确定的交点。
因此我们只需要求这样4个顶点的搭配有多少个了
也就是从n个顶点中取4个出来。
根据组合数的公式,(如果你不知道组合数的公式可以这么推:第一次取可以n个点都是可以取的,第二次取的时候第一个取的点就不能取了,所以只能取(n-1)种,以此类推)
由于改变四个点的顺序不会改变对角线,因此是求的组合而不是排列,也就要除以4!,也就是24
于是我们就得到了公式: n (n-1) (n-2) * (n-3) / 24
输出用unsigned long long