洛谷P2181对角线题解(C语言)

题目描述

对于一个 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个顶点的组合,我们高中都学过排列组合C{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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值