Uva 10177 (2/3/4)-D Sqr/Rects/Cubes/Boxes?

给出一个N*N的正方形方格,问能找到多少个正方形?矩形呢(不包括正方形)?

题目扩展到了3维和4维,三维的如下图,对应的是正方体和立方体(不包括正方体)

用ans1[k]表示k维下的正方形个数,ans2[k]表示k维下矩形个数,推下公式:

先考虑二维的情况,然后推广。

边长为 i 的二维正方形个数:\[a_2[i]=(N-i+1)^2\]

总的正方形个数:
\[\because \sum_{i=1}^{N}(N-i+1)^2=\sum_{i=1}^{N}i^2\]
\[\therefore \sum_{i=1}^{N}a[i]=\sum_{i=1}^{N}i^2=\frac{N(N+1)(2N+1)}{6}\]
长i宽j的矩形(包括正方形)个数:

\[c_2[i,j]=(N-i+1)^2(N-j+1)^2\]

总的矩形个数(包括正方形):
\[\sum_{i=1}^{N}\sum_{j=1}^{N}c[i,j]=\sum_{i=1}^{N}\sum_{j=1}^{N}(i\times j)=[\frac{N(N+1)}{2}]^2\]

推广到k维。

边长为i的k维正方形个数:

\[a_k[i]=(N-i+1)^k\]

总的k维正方形个数:
\[\sum_{i+1}^{N}a_k[i]=\sum_{i+1}^{N}i^k\]

k维矩形(第j个边长分别为\(i_j\)包括k维正方形)个数:
\[c_k[i]=\prod_{j=1}^{k}(N-i_j+1),i_j=1,2,\cdots,N\]

k维矩形(包括k维正方形)总数:
\[\sum_{j=1}^{N}\sum_{i_j=1}^{N}c_k[i]=\sum_{j=1}^{N}\sum_{i_j=1}^{N}\prod_{j=1}^{k}i_j\]
\[\because \sum_{i=1}^{N}\sum_{j=1}^{M}(i\times j)=1\times\sum_{j=1}^{M}+2\times\sum_{j=1}^{M}+\cdots+N\times\sum_{j=1}^{M}=(\sum_{i=1}^{N}i)\times(\sum_{j=1}^{M}j)\]
\[\therefore \sum_{j=1}^{N}\sum_{i_j=1}^{N}\prod_{j=1}^{k}i_j=\prod_{j=1}^{k}(\sum_{i_j=1}^{N}i_j)=\prod_{j=1}^{k}\frac{N(N+1)}{2}=[\frac{N(N+1)}{2}]^k\]
\[\therefore \sum_{j=1}^{N}\sum_{i_j=1}^{N}c_k[i]=[\frac{N(N+1)}{2}]^k\]

结果:
\[\text{ans1[k]}=\sum_{i=1}^{N}i^k\]
\[\text{ans2[k]}=[\frac{N(N+1)}{2}]^k-\text{ans1[k]}\]

复杂度O(n)。

1A

# include <stdio.h>

int main()
{
	int n;
	while (scanf("%d", &n) != EOF) {
		long long ans1[3], ans2[3];
		ans1[0] = ans1[1] = ans1[2] = 0;
		for (int i = 1; i <= n; ++i) {
			ans1[0] += i*i;
			ans1[1] += i*i*i;
			ans1[2] += i*i*i*i;
		}
		long long int t = n*(n+1)/2;
		ans2[0] = t*t-ans1[0];
		ans2[1] = t*t*t-ans1[1];
		ans2[2] = t*t*t*t-ans1[2];
		printf("%lld %lld %lld %lld %lld %lld\n", ans1[0], ans2[0], ans1[1], ans2[1], ans1[2], ans2[2]);
	}
	
	return 0;
}

 

posted @ 2013-12-08 12:29  努力变瘦  阅读(293)  评论(0编辑  收藏  举报