題目:
輸入:1個數N。(2 <= N <= 10^9)
輸出數量 Mod 10^9 + 7
2
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;