1. 程式人生 > 實用技巧 >洛谷 P2181 對角線 全面分析

洛谷 P2181 對角線 全面分析

對於一個 \(n\) 個頂點的凸多邊形,它的任何三條對角線都不會交於一點。請求出圖形中對角線交點的個數。

練python刷簡單題刷到了這個,挺有趣的一道題目。

1

對於一個 \(n\) 邊形,選任意一個點A可以引出\(n-3\)條對角線。相鄰的點B再引出\(n-3\)條線,分別與前者有\(1,2 ... n-3\)個交點。與B相鄰且不與A相鄰的C引出\(n-4\)條線,交A引出的對角線有\(1,2 ... n-4\)個交點,B亦然。

有一篇論文介紹得十分詳細 連結

故結果應為\(\sum\limits^{n-3}_{i=1}\sum\limits^{n-2-i}_{j=1} \quad= \quad\sum\limits^{n-3}_{i=1}\frac{(n-i-1)(n-i-2)}{2}\)

程式碼如下

n=int(input())
ans=0
i=1
while True :
    ans+=i*(n-(2+i))*(n-(1+i))//2
    if n-(1+i)<=2 :
        break
    i+=1
print(ans)

此方法可以解決這個問題,時間複雜度\(O(n)\)

2

我暫時不會對上述和式求和,但推測通項可能是三次的或四次的。故希望能\(O(1)\)解決這個問題。

\(f(n)=\sum\limits^{n-3}_{i=1}\frac{(n-i-1)(n-i-2)}{2}\) 易知\(f(3)=0,f(4)=1,f(5)=5,f(6)=15,f(7)=35\)


構建範德蒙德矩陣

\[V=vander(\begin{bmatrix}3&4&5&6&7\end{bmatrix}) \]

\[V*\vec A=\begin{bmatrix}0&1&5&15&35\end{bmatrix}^T \]

\[\vec A=\begin{bmatrix}\frac{1}{24}&-\frac{1}{4}&\frac{11}{24}&-\frac{1}{4}&0\end{bmatrix}^T \]

驗證\(n>=8\),成立。則

\[f(n)=[n^4\quad n^3\quad n^2 \quad n\quad1]\vec A \]

>> format rat
>> V=vander([3 4 5 6 7]);
>> inv(V)*[0;1;5;15;35]

ans =

       1/24    
      -1/4     
      11/24    
      -1/4     
      -1/25588634246423
a=int(input())
a=a*a*a*a-a*a*a*6+a*a*11-a*6
print(a//24)

3

實際上,用組合數學的方法,我們知道,每四個不同的頂點有一個交點,答案即是\(C^{4}_n=\frac{n(n-1)(n-2)(n-3)}{24}\)與以上結果相同。