HDU-2050

来源:互联网 发布:scilab 矩阵作差 编辑:程序博客网 时间:2024/06/05 08:41

链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=2050


题目:

Problem Description

我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。

C40-1008-1.jpg

Input

输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0

Output

对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。

Sample Input

2
1
2

Sample Output

2
7


思路:

转自:zhouhong1026,我稍微优化了一下公式。

  1.如果在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。

  容易得出:每新增一条直线,就将原来所有的区域分为两半,因此第n条直线会在原来的基础上新增n个平面:f[n]=f[n1]+n,其中f[0]=1

通项推导:
    f[n]=f[n1]+n
      =f[n2]+n+(n1)
      
      =f[0]+ni=1i
  f[n]=1+(n+1)n2

  2. 若每次使用两条直线分割,即此时的n相当于原来的2n,直接将上述问题推导结果中的n替换为2n,即:f[n]=1+(2n+1)(2n)2=1+2n2+n

  3. 若是普通直线,相交处所分割的平面为4份,而折线为两份,即每次分割比上面所考虑的情况少2份,那么只要在上述情况的每次分割时减去2就能得到本题的结果了:f[n]=f[n1]+4n12=f[n1]+4n3

通项公式:f[n]=1+2n2+n2n=2n2n+1


实现:

#include <cstdio>int main() {    long long t, n; scanf("%lld", &t);    while(scanf("%lld", &n), t--) printf("%lld\n", 2*n*n-n+1);    return 0;}
原创粉丝点击