杭电ACM1220——Cube~容易的数学题

杭电ACM1220——Cube~~简单的数学题

题目的意思是给你一个立方体的棱长 n ,将这个立方体分解成单位长度为1的小立方体。问这个大立方体分解之后的n * n * n个小立方体中有多少对小立方体的公共点不超过2个。

立方体分解之后,只会出现 0, 1, 2, 4个公共点的情况,所以算出所以的对数,然后减去4个公共点的情况就可以解决了。


关键是4个公共点的情况有多少对?

首先是有3个面没有露出来,总共只有8个,也就是那8个顶点,所以有 3 * 8对。

然后是有4个面没有露出来,总共有(n - 2)* 12种,所以有4 *  (n - 2)* 12。

然后是有5个面没有露出来,总共有(n - 2)^ 2 * 6种,所以有5 * (n - 2)^ 2 * 6。

最后是有6个面没有露出来,总共有(n - 2)^ 3种,所以有 6 * (n - 2)^ 3。

因为有重复,所以全部加起来还要除以2.

所以,4个公共点的情况有  (3 * 8 + 4 *  (n - 2)* 12 + 5 * (n - 2)^ 2 * 6 +  6 * (n - 2)^ 3)/ 2.

下面的是AC的代码:

#include <iostream>
using namespace std;

int main()
{
	int n;
	while(cin >> n)
	{
		cout << n * n * n * (n * n * n - 1) / 2 - (6 * (n - 2) * (n - 2) * (n - 2) + 
			24 + 4 * (n - 2) * 12 + 5 * (n - 2) * (n - 2) * 6) / 2 << endl;
	}
	return 0;
}