咱們看到過不少直線分割平面的題目,今天的這個題目稍微有些變化,咱們要求的是n條折線分割平面的最大數目。好比,一條折線能夠將平面分紅兩部分,兩條折線最多能夠將平面分紅7部分,具體以下所示。
html
Inputweb
輸入數據的第一行是一個整數C,表示測試實例的個數,而後是C 行數據,每行包含一個整數n(0<n<=10000),表示折線的數量。測試
Outputurl
對於每一個測試實例,請輸出平面的最大分割數,每一個實例的輸出佔一行。spa
Sample Inputorm
2
1
2htm
Sample Outputblog
2
7get
分析:it
先看N條相交的直線最多能把平面分割成多少塊
當添加第N條只顯示,爲了使平面最多, 則第N條直線要與前面的N-1條直線都相交,且沒有任何三條直線教育一個點。
則第N條直線有N-1個交點。因爲每增長N個交點,就增長N+1個平面,因此用N條直線來分隔平面,最多的數是1+1+2+3+…+n=1+n*(n+1)/2;
再看每次增長兩條相互平行的直線
當第N次添加時,前面已經有2N-2條直線了,因此第N次添加時,第2N-1條直線和第2N條直線都各能增長2*(n-1)+1 個平面。
因此第N次添加增長的面數是2[2(n-1) + 1] = 4n - 2 個。所以,總面數應該是
1 + 4n(n+1)/2 - 2n = 2n2 + 1
若是把每次加進來的平行邊讓它們一頭相交
則平面1、3已經合爲一個面,所以,每一組平行線相交後,就會較少一個面,
因此所求就是平行線分割平面數減去N,爲2n2 -n + 1
利用上述總結公式f(n)=2n2 -n + 1
#include<stdio.h>
int main()
{
int T,n;
scanf("%d",&T);
while(T--&&scanf("%d",&n)!=EOF)
printf("%d\n",2*n*n-n+1);
return 0;
}
或者利用公式f(n)=f(n-1)+4*(n-1)+1
#include<stdio.h>
int main()
{
__int64 s[10001];
int i,T,n;
scanf("%d",&T);
while(T--)
{
s[0]=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
s[i]=s[i-1]+4*(i-1)+1;
prin