1493: 平面划分

1493: 平面划分

http://www.acmore.net/problem.php?id=1493

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 139  Solved: 32

Description

一条直线能够将平面分成2部分,两条直线能够将平面分成4部分,而对于一条“V”型线而言,平面被分成2部分,两条“V”型线最多能够将平面分成7部分。对于椭圆封闭曲线对平面的划分又将不一样,任意两个椭圆至多有两个交点。现在给定一个N,你能够计算出三种不同情况下,空间最多被划分出多少个部分吗?

Input

若干组测试数据,每组测试数据占一行,每行一个正整数N(1<=N<=10^6)。

Output

每组数据输出一行,每行3个整数,之间用空格隔开。

分别输出N条直线,N条“V”型线,和N个椭圆最多能够将平面划分成多少部分,结果保证在10^18以内?

Sample Input

1
2

Sample Output

2 2 2
4 7 4

HINT

 

Source

Lyush

推理题:

   

新加入的一条直线与前面的直线都相交能够得到最多的空间划分。考虑到绿色的线是第三根插入的线,那么标号为1,2,3的线就是新区域的边界。对于如图加入第二个V型线,新增5个区域。如果增加第三个椭圆,新增4个区域。最后推出对于直线f[i] = f[i-1] + i;对于V型线f[i] = f[i-1] + 4*i-3;对于椭圆f[i] = f[i] + 2*i-2。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 const int maxn=1000010;
 8 
 9 long long f1[maxn],f2[maxn],f3[maxn];
10 
11 void Init(){
12     f1[1]=f2[1]=f3[1]=2;
13     for(int i=2;i<=1000000;i++){
14         f1[i]=f1[i-1]+i;
15         f2[i]=f2[i-1]+4*i-3;
16         f3[i]=f3[i-1]+2*i-2;
17     }
18 }
19 
20 int main(){
21 
22     //freopen("input.txt","r",stdin);
23 
24     int n;
25     Init();
26     while(scanf("%d",&n)!=EOF){
27         printf("%lld %lld %lld\n",f1[n],f2[n],f3[n]);
28     }
29     return 0;
30 }
原文地址:https://www.cnblogs.com/jackge/p/3019330.html