直線分割圓 公式遞推

2021-12-29 23:49:35 字數 1088 閱讀 8732

題目:

圓上有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 示例

2output 示例

2題目分析:

參考:直接這樣考慮就行了:

線段(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;

圓與直線交點

圓與直線交點題目鏈結 include 使用scanf和printf的標頭檔案 include 使用c風格字串函式的標頭檔案 include 使用演算法庫的標頭檔案,max,min,swap,sort等 include 使用cin,cout的標頭檔案 include 數學標頭檔案 include 使用...

直線分割平面問題

看了一下具體數學的1.2章,整理了一下關於乙個平面被分割的部分多少的問題 先考慮第乙個小問題 假設用l來表示答案,那麼有 最優的分法可以考慮是 1.沒有兩條直線互相平行 2.沒有三線共點 也就是說,如果現在有乙個n條線的最優情況,我要新加第n 1條線,讓他順次穿過前n條線,即穿過了n 1個部分,即增...

Canvas 直線 矩形和圓

const mycanvas document.getelementbyid mycanvas const ctx mycanvas.getcontext 2d ctx.moveto 0 0 ctx.lineto 100 100 ctx.stroke moveto是移動,可以理解為移動畫筆。line...