题目大意:
给你二维三维四维表面都是方格,方格都是1×1的,给你n,代表n×n,3维就是n×n×n。。。。。
让你求出有多少正方形,长方形(二维), 立方体,长方体(3维)。。。。。
算法分析:
其实就是公式推导。
以二维为例,你要先能求出矩形的个数(包含正方形),其实很好求,就是每条边任意取两条线,这两条线一定能组成一个矩形(当然也可能是正方形,正方形也是矩形)。
所以矩形的个数就是就是(n+1)中取2的组合数的平方,也就是(n+1)* n/2 的平方,那么3维也就是3次方,四维就是4次方。。。。矩形搞定了。那么再求出方形的,减一下就能求出纯矩形了。
方形也很好算:1×1的肯定有n×n个,2×2的就有(n-1)*(n-1)个。。。。。。。n×n的只有1个,就是平方和公式啦。
同理三维就是立方和公式啦
四维就是4次方求和(从1到n的四次方和公式)
直接给代码包含一些公式的推导啊:
//平方和公式
//(利用恒等式(n+1)^3=n^3+3n^2+3n+1):
// (n+1)^3-n^3=3n^2+3n+1,
// n^3-(n-1)^3=3(n-1)^2+3(n-1)+1
// ..............................
// 3^3-2^3=3*(2^2)+3*2+1
// 2^3-1^3=3*(1^2)+3*1+1.
// 把这n个等式两端分别相加,得:
// (n+1)^3-1=3(1^2+2^2+3^2+....+n^2)+3(1+2+3+...+n)+n,
// 由于1+2+3+...+n=(n+1)n/2,
// 代人上式得:
// n^3+3n^2+3n=3(1^2+2^2+3^2+....+n^2)+3(n+1)n/2+n
// 整理后得:
// 1^2+2^2+3^2+....+n^2=n(n+1)(2n+1)/6
//立方和
//1^3+2^3+3^3+……+n^3=[n(n+1)/2]^2
//证明:
//(n+1)^4-n^4=[(n+1)^2+n^2][(n+1)^2-n^2]
//=(2n^2+2n+1)(2n+1)
//=4n^3+6n^2+4n+1
//
//2^4-1^4=4*1^3+6*1^2+4*1+1
//3^4-2^4=4*2^3+6*2^2+4*2+1
//4^4-3^4=4*3^3+6*3^2+4*3+1
//......
//(n+1)^4-n^4=4*n^3+6*n^2+4*n+1
//
//各式相加有
//(n+1)^4-1=4*(1^3+2^3+3^3...+n^3)+6*(1^2+2^2+...+n^2)+4*(1+2+3+...+n)+n
//
//4*(1^3+2^3+3^3+...+n^3)=(n+1)^4-1+6*[n(n+1)(2n+1)/6]+4*[(1+n)n/2]+n=[n(n+1)]^2
//
//1^3+2^3+...+n^3=[n(n+1)/2]^2
//四次方和公式
//令n的k次方表示为n^k,令*表示乘法。
//如下举例说明N方和求和方法。
//F(n)=1^4+2^4+…+n^4
//F(n)=(1^3+2^3+…+n^3)n-{1^3+(1^3+2^3)+…[1^3+2^3+…(n-1) ^3]}
//F(n)=[n^2*(n+1) ^2]/4-[(1*2)^2+(2*3)^2+…+(n-1) ^2*n^2]
//令h(n)=n^2*(n+1) ^2#
//h(n)+h(n-1)=2n^4+2n^2@1
//…
//h(2)+h(1)=2*2^4+2*2^2@n-1
//以上@1到@n-1求和。
//h(n)+2[h(n-1)+…+h(2)]+h(1)=2[F(n)-1]+2[1^2+2^2+…+n^2-1]
//[h(n-1)+…+h(2)+h(1)]=[F(n)-1]+(1^2+2^2+…+n^2-1)+[h(1)-h(n)]/2
//此式代入#可求得。F(n)=(6n^5+15n^4+10n^3-n)/30
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
long long N;
long long s2,r2,s3,r3,s4,r4;
while (scanf("%lld", &N) != EOF)
{
s2 = N * (N + 1) * (2 * N + 1) / 6;//正方形的个数就是2维,平方求和,3维,3次方求和,4维,四次方求和
r2 = (N + 1) * N * N * (N + 1) /4;//每个面取两条线,然后就能得到所有矩形的数(包括正方形)(n+1)取2的组合数,有几个面相乘几次,下同
s3 = r2;
r3 = (N + 1) * N * N * (N + 1) * N * (N + 1) / 8;
s4 = (6*N*N*N*N*N + 15*N*N*N*N + 10*N*N*N - N) / 30;
r4 = (N + 1) * N * N * (N + 1) * N * (N + 1) * N * (N + 1)/16;
printf("%lld %lld %lld %lld %lld %lld\n",s2, r2 - s2, s3, r3 - s3, s4, r4 - s4);
}
return 0;
}