对于一个 n个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。
例如,6 边形:
输入格式
输入只有一行一个整数 n,代表边数。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入
3
输出
0
输入
6
输出
15
分析:
(1)已知四个顶点所组成的四边形的对角线有1个交点。
(2)因此,题目改为判断n个顶点中取4个顶点有几种取法,即组合数C64。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<n*(n-1)*(n-2)*(n-3)/24;
return 0;
}
但是,确实这样。。。。。。
(3)所以想办法改进代码,防止超时。n与(n-1)之中有一个是2的倍数,n与(n-1)与(n-2)之中有一个是3的倍数,因此就放它们一边做乘法,一边做除法,即n*(n-1)/2*(n-2)/3*(n-3)。
(4)为了防止越界,类型定义为long long
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n;
cin>>n;
cout<<n*(n-1)/2*(n-2)/3*(n-3)/4;
return 0;
}
但是,还有两个测试点过不去。
(5)看了别人的题解,才知道自己的问题。unsigned long long 的范围是[0,264-1]。如果越界了以后就相当于是对264-1求模了。
long long 是有符号类型它的范围是[-263-1,263+1],因为有符号的第63位表示“正负”而不表示数值,但数据越界了以后就会从负数开始计数。
#include <bits/stdc++.h>
using namespace std;
int main()
{
unsigned long long n;//注意!!!!!!
cin>>n;
cout<<n*(n-1)/2*(n-2)/3*(n-3)/4;//注意!!!!!!
return 0;
}