1657 圆的划分问题

Description

在一个无限延伸平面上有一个圆和n条直线,这些直线中每一条都在一个圆内,并且同其他所有的直线相交,假设没有3条直线相交于一点,试问这些直线最多将圆分成多少区域。
Input

第一行包含一个整数T,(0< T<=100)表示测试次数。
每组测试数据包含一个整数N(0<=N<=10000000),表示直线的条数。
Output

对于每一组测试数据,输出这个圆能被这N条直线分成的最多区域数。
Sample Input
Raw
2
1
2
Sample Output
Raw
2

4

题解:

令hn表示这n条直线将圆内分割成的区域块数。
因为第n条直线和原先的n-1条直线在圆内各有一交点,所以它被切成n条线段。而每条线段可将原来已形成的每个区域分成两块,所以有
hn=hn-1+n h0=1
由这个递推关系,有
hn-1=hn-2+n-1
将这两个关系式两端相减,得
hn-2hn-1+hn-2=1
再由这个递推关系,又有
hn-1-2hn-2+hn-3=1
将其与上式相减,得
hn-3hn-1+3hn-2-hn-3=0
利用h0=1,h1=2,h2=4,解这个齐次递推关系,得 hn=1+(n+1)*n/2

代码:

#include<cstdio>
int main()
{
	long long t,n,a;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld",&n);
		if(n==0)
		{
			printf("1\n");continue;
		}
		a=1+n*(n+1)/2;
		printf("%lld\n",a);
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值