#pragma warning(disable:4786)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<queue>
#include<set>
#include<vector>
#include<string>
#include<ctime>
#include<string.h>
using namespace std;
#define pi acos(-1.0)
//#define LL __int64
typedef long long LL;
#define INF 0x7fffffffffffffff
#define bug puts("hear!")
#define inf 0x7fffffff
#define eps 1e-10
#define FRE freopen("in.txt","r",stdin)
#define E exp(1.0)
#define mod 1000000007
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
printf("%d\n",(n*n*n+5*n)/6+1);
return 0;
}
数学公式
n个平面最多分空间为几个部分的问题首先,可以通过直观想象1-3个平面最多分空间为几个部分。
1个平面最多将空间分为2部分;
2个平面最多将空间分为4部分;
3个平面最多将空间分为8部分;
若要第四个平面将空间分为最多部分,就要它与前三个平面都相交,且交线不重合。则第四个平面与前三个平面都相交,交线不重合,有三条交线,
这三条交线都在第四个平面内,那么【要想使这四个平面分空间为最多部分就要使这三条交线分一个平面为最多部分】。显然,三条直线分一个平面最多
为7部分。所以,四个平面分空间数最多为:三个平面最多分平面数加上三条直线最多分平面的部分数:8+7=15。
推广到一般情况,n个平面最多可分空间为f(n)部分,第n个平面与n-1个平面分别相交且交线不重合,问题转化为n-1条直线最多将一个平面分成几部分。
所以:
f(n)=f(n-1)+n(n+1)/2+1
递归得:
f(n)=(n^3 + 5n + 6)/6
借鉴网友的思想~~~~~~~~~~~~~~~~~~~~~~~
【我自己的理解:】
第一步:一刀切下去,将空间切为两半
sum[ 1 ] = 2
第二步:一刀切下去,上一个平面与这个平面的交线将这个平面分为两半,在原来的基础上增加2(如图中圆形分区)
sum[ 2 ] = sum[ 1 ]+2=4
第三步:一刀切下去,上两个平面与这个平面的交线将这个平面分为四半,在原来的基础上增加4(如图中圆形分区)
sum[ 3 ] = sum[ 2 ] + 4 = 8
第四步:一刀切下去,上三个平面与这个平面的交线将这个平面分为七半,在原来的基础上增加7(如图中圆形分区)
sum[ 4 ] = sum[ 3 ] + 7 = 15
第五步:一刀切下去,上四个平面与这个平面的交线将这个平面分为11半,在原来的基础上增加11(如图中圆形分区)
sum[ 5 ] = sum[ 4 ] + 11 = 26
即:
切完后依次为:
2,4,8,15,26,42…………………
两者之差为D[n]:
2,4,7,11,16……………….
两者之差的查为d[n]:
2,3,4,5……………….
d[n] = d[ n – 1] + 1 -------àd[n] = n+1
-àD[n] = D[n – 1] + n----àD[n] = 2 +2+3+4+......+n = 1 +n*(n + 1)/2
sum[n] = sum[n - 1] +D[n]---àsum[n] = sum[1] +D[n]+ D[n-1]+ .....+D[2]
另外,这类问题一般都有固定的公式,告诉大家一个技巧:二维的一般是f(x)=a*x^2+b*x+c,三维的一般是f(x)=a*x^3+b*x^2+c*x+d. 用带定系数法求出各个系数就行了。
这是大牛的思路。我是直接推得公式的,思路写起来太麻烦,就COPY了。