max of 直線劃平面

在一個無限延伸平面上有一個圓和n條直線,這些直線中每一條都在一個圓內,而且同其餘全部的直線相交,假設沒有3條直線相交於一點,試問這些直線 最多將圓分紅多少區域。
第一行包含一個整數T,(0< T<=100)表示測試次數。
每組測試數據包含一個整數N( 0<=N<=10000000),表示直線的條數。
對於每一組測試數據,輸出這個圓能被這N條直線分紅的 最多區域數。

sample Input測試

2
1
2

sample Outputspa

2
4
 
 
詳細解答:

問題描述:code

     n條直線最多能劃分出多少個平面?blog

問題分析:遞歸

     平面上只要多出現一條直線,就能至少多把平面分出一部分,而若此直線與其餘直線有n個交點,就再能把平面多分出n個部分,所以若想把平面劃分的部分最多,新添入的直線必須與前k條直線交k個點,即第二條直線要與第一條直線交1個點,第三條要與前兩條交2個點,……,第1999條與前1998條交1998個點,這樣,第二條直線多劃分出1+1=2個部分,第三條直線多劃分出1+2=3個部分,……,第1999條直線多劃分出1+1998=1999個部分。而第一條直線把平面劃分出2個部分,所以1999條直線能劃分平面的塊數爲:
2+2+3+4+5+…+1998+1999  = 1+(1+2+3+4+5+…+1998+1999)  = 1+(1+1999)*1999/2  = 1999001ip

     對n條直線最多劃分平面數:input

    (1)使用遞歸it

         f(n) = n + f(n-1) ,   n > 1      io

         f(n) = 2               ,   n = 1class

    (2)使用遞推

         n = 1,  S1 = 2       

         n > 1,  Sn = 2 + 2 + 3 + …… + n  = 1 + n * (n+1) / 2

#include<stdio.h>
int main()
{
    int t;
    long long n;
    long long sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);//64bit防溢出
        sum=1+n*(n+1)/2;//遞推公式使用
        printf("%lld\n",sum);
    }
    return 0;
}
相關文章
相關標籤/搜索