被打臉的瀟灑哥(推遞推式)
阿新 • • 發佈:2019-01-06
連結:https://ac.nowcoder.com/acm/contest/318/M
來源:牛客網
在一次青青草原ACM個人賽中,瀟灑哥被喜洋洋以30s罰時壓制,委屈的當了個第二。瀟灑哥蹲在角落說出了他的口頭禪,並畫起了圈圈。
突然,他想出了一個有趣的題目,跑去給喜洋洋做。喜洋洋看到題目後懵逼了,但是看到瀟灑哥臉上欠揍的笑容就不爽,暗想一定要做出來狠狠的打瀟灑哥的臉。
於是,他以上廁所為名義跑出來用手機把題目發給了你,希望你能幫你做出來讓他可以嘲諷瀟灑哥。
你收到的題目如下:
平面上有n個圓,求使這n個圓兩兩相交(即每兩個圓之間恰好有兩個交點)後最多能把平面劃分成多少個區域。
輸入描述:
一個正整數t,表示有t(1≤t≤100)組資料。 接下來t行,每行一個整數n(0≤n≤1000),代表平面內圓的個數。
輸出描述:
輸出共t行。每行一個正整數,表示對應的n個圓將該平面劃分成的最大的區域數。
示例1
輸入
3 1 2 3
輸出
2 4 8
說明
第一個樣例,平面只有一個圓,此時將平面劃分成圓內和圓外兩個區域;
第二個樣例,平面上有兩個圓,兩圓相交可以將平面劃分成四個區域(見下圖)。
題解:我是根據交點來推的,1個圓為0個交點,2個圓為2個交點,3個圓為6個。。。。。然後就可以推出來每次在原來的基礎上多了(n-1)*2個交點,也就是多了這麼多的交點,這個題的坑點在於0,一開始的提交沒考慮到0個圓,第二次想錯了,以為0個的時候平面是0,其他基本很簡單
程式碼:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int main() { long long int sum[1005]={0}; sum[0]=1; sum[1]=2; for(int t=2;t<=1000;t++) { sum[t]=sum[t-1]+(t-1)*2; } int T; cin>>T; //int a[105]; for(int t=0;t<T;t++) { int n; scanf("%d",&n); printf("%lld\n",sum[n]); } return 0; }