天天看點

對角線

P2181對角線

對角線
對角線
  • 這明明是一道組合數的題,,,不懂為什麼會放在計算幾何當中。。。。

感覺下面幾個題解都隻是放了個公式,并沒有具體講怎麼來的

(如果你覺得“在經過一些排列組合的技巧,就可以得出”算具體的話就另當别論了)

感覺推起來還是很妙的

其實這和對角線的公式沒什麼關系。。。。

首先由于不會有三條對角線交于一點,是以過某一個交點有且隻能有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也可以除盡

#include<bits/stdc++.h>
using namespace std;
unsigned long long n,ans;
int main()
{
    scanf("%lld",&n);
    ans=n * (n-1) / 2 * (n-2) / 3 * (n-3) / 4;
    printf("%lld\n",ans);
    return 0;
}
           

繼續閱讀