组合数学 - 对角线 - 洛谷 P2181
题目描述
对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。
6 边形:
输入格式
输入只有一行一个整数 n,代表边数。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入1:
3
输出1:
0
输入2:
6
输出2:
15
数据范围:
3 ≤ n ≤ 1 0 5 3 \leq n \leq 10^5 3≤n≤105
分析:
由 题 意 , 保 证 了 任 意 三 条 对 角 线 都 不 会 交 于 同 一 点 , 由题意,保证了任意三条对角线都不会交于同一点, 由题意,保证了任意三条对角线都不会交于同一点,
也 就 是 说 , 每 个 交 点 都 仅 有 两 条 对 角 线 唯 一 确 定 。 也就是说,每个交点都仅有两条对角线唯一确定。 也就是说,每个交点都仅有两条对角线唯一确定。
那 么 每 个 交 点 就 对 应 两 条 对 角 线 , 即 四 个 顶 点 。 那么每个交点就对应两条对角线,即四个顶点。 那么每个交点就对应两条对角线,即四个顶点。
问 题 等 价 于 我 们 从 n 个 点 中 选 择 4 个 点 , 问 一 共 有 多 少 种 的 方 案 。 问题等价于我们从n个点中选择4个点,问一共有多少种的方案。 问题等价于我们从n个点中选择4个点,问一共有多少种的方案。
答 案 : C n 4 = n ( n − 1 ) ( n − 2 ) ( n − 3 ) 4 ! 答案:C_n^4=\frac{n(n-1)(n-2)(n-3)}{4!} 答案:Cn4=4!n(n−1)(n−2)(n−3)
n 在 1 0 5 数 量 级 , 4 ! = 24 , 答 案 不 会 超 过 1 0 19 , 可 以 用 无 符 号 长 整 型 存 储 。 n在10^5数量级,4!=24,答案不会超过10^{19},可以用无符号长整型存储。 n在105数量级,4!=24,答案不会超过1019,可以用无符号长整型存储。
为 了 防 止 溢 出 , 我 们 做 乘 法 时 要 同 时 做 除 法 。 为了防止溢出,我们做乘法时要同时做除法。 为了防止溢出,我们做乘法时要同时做除法。
因 为 n × ( n − 1 ) 必 有 因 子 2 , 故 我 们 在 计 算 n × ( n − 1 ) 后 立 即 除 2 ( 这 里 只 除 去 了 因 子 2 , 不 会 影 响 因 子 3 ) 因为n×(n-1)必有因子2,故我们在计算n×(n-1)后立即除2(这里只除去了因子2,不会影响因子3) 因为n×(n−1)必有因子2,故我们在计算n×(n−1)后立即除2(这里只除去了因子2,不会影响因子3)
同 理 , n × ( n − 1 ) × ( n − 2 ) 必 有 因 子 3 , 故 我 们 在 累 乘 上 n − 3 后 立 即 除 3 , 同理,n×(n-1)×(n-2)必有因子3,故我们在累乘上n-3后立即除3, 同理,n×(n−1)×(n−2)必有因子3,故我们在累乘上n−3后立即除3,
同 理 , 最 后 除 4. 同理,最后除4. 同理,最后除4.
代码:
#include<iostream>
#define ull unsigned long long
using namespace std;
int main()
{
ull n;
cin>>n;
cout<<(ull)n*(n-1)/2*(n-2)/3*(n-3)/4<<endl;
return 0;
}