直線分割圓-公式遞推

題目:

圓上有N個點,每個點和其他所有點之間都有直線相連。並且任意3線不共點。計算這些直線把圓分割所得的區域的數量K。
例如:N = 2,K = 2,N = 3,K = 4。由於結果可能會很大,輸出K Mod (10^9 + 7)的結果。
Input
輸入:1個數N。(2 <= N <= 10^9)
Output
輸出數量 Mod 10^9 + 7
Input 示例
2
Output 示例
2

題目分析:

參考:http://bbs.csdn.net/topics/300104643

直接這樣考慮就行了:

線段(An+1,Ai)左邊有i-1個點,右邊有n-i個點,
顯然,任意左右兩點間的連線都與(An+1,Ai)相交,總共是(i-1)*(n-i)個交點
所以增加的塊數是(i-1)*(n-i)+1
這樣,增加一個點後,總共增加:∑[(i-1)*(n-i)+1]塊,其中i從1到n求和。
這個求和僅用到平方與自然數數列和公式,結果立等可取:n(n^2-3n+8)/6
於是,遞推公式爲:
f(n+1)=f(n)+n(n^2-3n+8)/6

利用f(1)=1,累加起來有f(n)=1+∑i(i^2-3i+8)/6,其中i從1到n-1。
這個求和最多用到三次數列的求和,結果依然立等可取:f(n)=(n^4-6n^3+23n^2-18n+24)/24


解法二:
先分析:
增加一個點後其中的一個典型線段所多劃分的區域顯然是O(n^2),所以總共增加的區域數爲O(n^3)
遞加項是O(n^3),顯然通項那就是O(n^4)的,也就是說f(n)是個四次多項式,即
f(n)=a*n^4 + b*n^3 + c*n^2 + d*n +e
五個參數,需要五個方程
手繪1-5的情況,可以數得:f(1)=1,f(2)=2,f(3)=4,f(4)=8,f(5)=16
聯立之後即可解出通項公式

 

關鍵代碼:

 

ans = ( n4 - n3 * 6 + n2 * 23 - n * 18 + 24 ) / 24 % P;
        if( ans < 0 ) ans += P;
        return (int) ans;


 

 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章