平面划分。

来源:互联网 发布:android app 端口号 编辑:程序博客网 时间:2024/04/27 18:44

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

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

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

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

输入 1 2
输出 2 2 2
4 7 4
本题很简单,直接代公式。具体推导过程,看你数学基础了(高中生照样能完成的)
列出它们之间的递归关系:
直线: f(n)=f(n-1)+n;
v型直线:f(n)=f(n-1)+4n-3;
椭圆(两两相交只要两个点):f(n)=f(n-1)+2(n-1);
如果不求,直接去递归,直接就TLE了。
方法:累加相消。
举一个例子:
对于f(n)=f(n-1)+n;
f(n)-f(n-1)=n
f(n-1)-f(n-2)=n-1;
f(n-2)-f(n-3)=n-2;
.......
 f(2)-f(1)=2;
左右相加得:f(n)-f(1)=n+n-1+n-2+......n-(n-2);
故:f(n)=n(n-1)-(n-1)(n-2)/2+2;
化解得:f(n)=(n^2+n+2)/2;
另外两个:同样的方法。

#include<stdio.h>int main(){    long long n,L1,L2,L3;   while(scanf("%lld",&n)!=-1)   {   L1=(n*n+n+2)/2;      //直线划分平面            L2=2*n*n-n+1;        //V直线划分平面    L3=n*n-n+2;          //椭圆(两两相交只有2个点)如果是四个 2*n*n-2*n+2   printf("%lld %lld %lld\n",L1,L2,L3);   }   return 0;}


原创粉丝点击