2014-06-10 15:56:02
题意&思路:分别计算2、3、4维grie / cube / hypercube 中Square、Rectangle(3、4中对应的图形和类推)的个数。
首先,可以知道总数为:(n * (n + 1) / 2) ^ k,k为维度,因为某个图形(可能多维)在任何一条坐标轴上的投影长度范围是【1,n】,长度为1的有n段,2的有n/2段。。。。n的有1段,所以总共有(1+2+3。。+n)=n× (n+1)/2段,也就是说每条坐标轴上的投影都有这么多的可能,所以总共有(n×(n+1)/2)^k中可能,即为总数。
其次:计算Square个数,二维的就是1^2+2^2+3^2+.....+n^2,三维:1^3+2^3+3^3+...+n^3,四维同理,因为题目要求效率,所以必然要用公式来求!
利用次方差公式可以求得:
(2维度)
n^3-(n-1)^3=1*[n^2+(n-1)^2+n(n-1)]
=n^2+(n-1)^2+n^2-n
=2*n^2+(n-1)^2-n
2^3-1^3=2*2^2+1^2-2
3^3-2^3=2*3^2+2^2-3
4^3-3^3=2*4^2+3^2-4
......
n^3-(n-1)^3=2*n^2+(n-1)^2-n
各等式全相加
n^3-1^3=2*(2^2+3^2+...+n^2)+[1^2+2^2+...+(n-1)^2]-(2+3+4+...+n)
n^3-1=2*(1^2+2^2+3^2+...+n^2)-2+[1^2+2^2+...+(n-1)^2+n^2]-n^2-(2+3+4+...+n)
n^3-1=3*(1^2+2^2+3^2+...+n^2)-2-n^2-(1+2+3+...+n)+1
n^3-1=3(1^2+2^2+...+n^2)-1-n^2-n(n+1)/2
3(1^2+2^2+...+n^2)=n^3+n^2+n(n+1)/2=(n/2)(2n^2+2n+n+1)
=(n/2)(n+1)(2n+1)
1^2+2^2+3^2+...+n^2=n(n+1)(2n+1)/6
(3维度)
(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
(4维度)
(n+1)^5-n^5=5n^4+10n^3+10n^2+5n+1
n^5-(n-1)^5=5(n-1)^4+10(n-1)^3+10(n-1)^2+5(n-1)+1
……
2^5-1^5=5*1^4+10*1^3+10*1^2+5*1+1
全加起来
(n+1)^5-1^5=5*(1^4+2^4+3^4+4^4+……+n^4)+10*(1^3+2^3+3^3+4^3+……+n^3)+10*(1^2+2^2+3^2+4^4+……+n^2)+5*(1+2+3+4+……+n)+n
因为1^3+2^3+3^3+4^3+……+n^3=[n(n+1)/2]^2
1^2+2^2+3^2+4^4+……+n^2=n(n+1)(2n+1)/6
1+2+3+4+……+n=n(n+1)/2
所以1^4+2^4+3^4+4^4+……+n^4
={[(n+1)^5-1^5]-10*[n(n+1)/2]^2-10*n(n+1)(2n+1)/6-5*n(n+1)/2-n}/5
=n(n+1)(2n+1)(3n^2+3n-1)/30
#include <cstdio> #include <cmath> int main(){ long long n,m,sum,sq2,sq3,sq4; while(scanf("%lld",&n) == 1){ m = n * (n + 1) / 2; sq2 = m * (2 * n + 1) / 3; sq3 = m * m; sq4 = sq2 * (3 * n * n + 3 * n - 1) / 5; printf("%lld %lld %lld %lld %lld %lld\n",sq2,(long long)pow(1.0 * m,2.0) - sq2, sq3,(long long)pow(1.0 * m,3.0) - sq3,sq4,(long long)pow(1.0 * m,4.0) - sq4); } return 0; }