1. 程式人生 > >被打臉的瀟灑哥(推遞推式)

被打臉的瀟灑哥(推遞推式)

連結: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;
}