题目链接:Cube
大意:将边长为 n 的正方体分割成 1 * 1 * 1 的正方体,问有多少对正方体,他们之间有不超过 2 个公共的点。。。
正推的话感觉难度不小。。。
因为任意两个正方体,他们之间可能有 0 1 2 4 个共同的点;
所以我们可以想到“正难则反”
边长为 n 的正方体,可以分割成 n*n*n 个 1*1*1 的正方体,从中任取两个 即为 n*(n-1)/2
下面计算两个正方体之间有四个点的情况:
1) 正方体和周围 3 个正方体相邻,这种情况共有 8 个 ,求得个数为 3 * 8
2)正方体和周围 4 个正方体相邻,这种情况共有 (n-2)*12 个 ,求得个数为 4 * (n-2)*12
3)正方体和周围 5 个正方体相邻,这种情况共有 6*(n*n - 4 * n + 4)个,求得的个数为 5 * 6 * (n*n - 4 * n + 4)
4)正方体和周围 6 个正方体相邻,这种情况共有(n*n*n - n*n*6+n*12-8)个,求得的个数为6 * (n*n*n - n*n*6+n*12-8)
最后将所求的两个正方体之间有四个点的情况 ÷2 即可(比如 2 选 3 和 3 选 2 造成的重复
两者做差即可!
边长为 1 时进行一下特判!!!
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n == 1)
{
printf("0\n");
continue;
}
long long anssum = n*n*n*(n*n*n-1)/2;
int edge3 = 8;
int ans3 = 3 * edge3;
int edge4 = (n-2)*12;
int ans4 = 4 * edge4;
int edge5 = n*n - 4 * n + 4;
int ans5 = 5 * 6*edge5;
int edge6 = n*n*n - n*n*6+n*12-8;
int ans6 = 6 * edge6;
long long ans = anssum - (ans3 + ans4 + ans5 + ans6)/2;
cout<<ans<<endl;
}
return 0;
}