被打脸的潇洒哥(推递推式)

链接: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;
}

 

posted @ 2018-12-23 16:59  black_hole6  阅读(282)  评论(0编辑  收藏  举报