原题:
Problem Description
。。。。。想象着正式校庆那一天,校长亲自操刀,把这个大蛋糕分给各地赶来祝贺的校友们,大家一定很高兴,呵呵,流口水了吧…
等一等,吃蛋糕之前先考大家一个问题:如果校长大人在蛋糕上切了N刀(校长刀法极好,每一刀都是一个绝对的平面),最多可以把这个球形蛋糕切成几块呢?
做不出这个题目,没有蛋糕吃的!
为-了-母-校-,为-了-蛋-糕-(不是为了DGMM,枫之羽最会浮想联翩…),加-油-!
Input
输入数据包含多个测试实例,每个实例占一行,每行包含一个整数n(1<=n<=1000),表示切的刀数。
Output
对于每组输入数据,请输出对应的蛋糕块数,每个测试实例输出一行。
Sample Input
1
2
3- Sample Output
2
4
8 解题思路:
题目的意思,就是给你一个空间,用n个平面可以将空间分割成多少小空间?!
- 可以从二位平面入手:给你一个平面,用n条线可以将平面分割成多少小平面??(这n条直线中,任两条不平行,任三条不交于同一点)
- 设n条直线最多可将平面分割成 bn个部分
- 当n=1,2,3时,易知平面最多被分为2,4,7个部分
- 当n=k 时,设 k条直线将平面分成了 bk个部分。
- 接着当添加上第k+1条直线时,这条直线与前k 条直线相交有 k个交点,这 k个交点将第k+1条直线分割成k段,而每一段将它所在的区域一分为二,从而增加了K+1个区域
- 故得递推关系式:b(k+1)=b(k)+(k+1) ,即 b(k)-b(k-1)=k+1
显然当k=1 时, b(1) =2,当k=2,3…..n 时,我们得到下列式子:
- b(2)-b(1)=2;
- b(3)-b(2)=3;
- b(4)-b(3)=4;
- b(5)-b(4)=5;
…… - b(n)-b(n-1)=n;
- 将这 n-1个式子相加,得b(n)=1/2×(n^2+n+2),即n条直线最多可将平面分割成1/2×(n^2+n+2) 个部分。
- 现在,我们回到原问题,用刚才的思路来解决空间的问题,设k个平面将空间分割成a(k)个部分,再添加上第k+1个平面,这个平面与前k个平面相交有k条交线,这k条交线,任意三条不共点,任意两条不平行,因此这第k+1个平面就被这k条直线分割成b(k)个部分。
- 这b(k)个部分平面中的每一个,都把它所通过的那一部分空间分割成两个较小的空间。所以,添加上这第k+1个平面后就把原有的空间数增加了b(k)个部分。
- 由此的递推关系式:a(k+1)=a(k)+b(k), 即 a(k)-a(k-1)=b(k)
当k=2,3……..n时,我们得到如下n-1个关系式
- a(2)-a(1)=b(1);
- a(3)-a(2)=b(2);
…… - a(n)-a(n-1)=b(n-1);
- 将这n-1个式子相加,得
a(n)=a(1)+(b(1)+b(2)+b(3)+…….+b(n-1))
因为 b(n)= 1/2*(n^2+n+2),a(1)=2
所以 a(n)=2+{1/2*(1^2+1+2)+(2^2+2+2)+(3^2+3+2)+……..+((n-1^2)+(n-1)+2)}=(n^3+5×n+6)/6
n个平面最多可将平面分割成 =(n^3+5×n+6)/6个部分
代码:
#include<stdio.h> short n; int main(){ while (scanf("%d",&n)!=EOF) printf("%d\n", (n * n * n + 5 * n + 6) / 6); }
总结一下数学常用的公式:
立方和公式:a^3 +b^3 = (a+b)(a^2-ab+b^2)
立方差公式:a^3 - b^3 = (a -b)(a^2+ab+b^2)
平方前n项和:1^2+2^2+3^2+…+n^2 = n(n+1)(2n+1)/6
立方前n项和:1^3+2^3+3^3+…+n^3 = [n(n+1)/2]^2
n条直线最多可将平面分割成(n^2+n+2)/2个部分
n个平面最多可将平面分割成(n^3+5×n+6)/6个部分
n个三角形最多可以把平面分成sum[n-1]+6×(n-1)个部分- 可以从二位平面入手:给你一个平面,用n条线可以将平面分割成多少小平面??(这n条直线中,任两条不平行,任三条不交于同一点)