zoukankan      html  css  js  c++  java
  • 【luogu2181】对角线

    首先由于不会有三条对角线交于一点,所以过某一个交点有且只能有2条对角线

    而这两条对角线实质上是确定了4个顶点(也可以看做是一个四边形的两条对角线交于一点,求四边形的数量)。

    因此我们只需要确定4个顶点就得到了这个唯一确定的交点。

    因此我们只需要求这样4个顶点的搭配有多少个了

    也就是从n个顶点中取4个出来。

    根据组合数的公式,(如果你不知道组合数的公式可以这么推:第一次取可以n个点都是可以取的,第二次取的时候第一个取的点就不能取了,所以只能取(n-1)种,以此类推)

    由于改变四个点的顺序不会改变对角线,因此是求的组合而不是排列,也就要除以4!,也就是24

    于是我们就得到了公式: n (n-1) (n-2) * (n-3) / 24

    同时为了防止爆掉,但又不想写高精,

    我们可以采用一种化简的技巧

    于是原式可以化为:

    n (n-1) / 2 (n-2) / 3 * (n-3) / 4

    那为什么这样一定是对的呢?难道不会因为除不尽却向下取整而导致错误吗?

    事实上是一定除得尽的

    首先n和n-1一定有一个是2的倍数,因此2可以除尽,

    同理n,n-1,n-2中一定有一个是3的倍数,因此3可以除尽(除掉2只会消除因数2而对3没有影响)

    同理4也可以除尽

    完\(^o^)/~

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 unsigned long long n,ans;
     4 int main()
     5 {
     6     scanf("%lld",&n);
     7     ans=n * (n-1) / 2 * (n-2) / 3 * (n-3) / 4;
     8     printf("%lld
    ",ans);
     9     return 0;
    10 }
  • 相关阅读:
    无法启动IIS Express Web服务器 端口"1025"正在使用
    mysql查看是否锁表并解除锁
    C#的栈
    面向对象VS面向过程
    Visual Studio包管理器NuGet 依赖管理
    Vue中的Promise.all()
    【1024练习】Mybatis练习三
    【1023练习】MyBatis练习二
    【练习】mybatis
    【练习】json数组,以及json对象数组循环在页面的选择下拉框,ul列表,table等中显示出来
  • 原文地址:https://www.cnblogs.com/ww3113306/p/8762967.html
Copyright © 2011-2022 走看看