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;
}