题目大意是
在魔方上找到有多少对小立方块它们之间连接的点不超过两个
因为任意两个立方块之间相连的点就只有0,1,2,4 这样4种情况
那么我们只需要考虑总共的组成立方块对数
sum = C(2 , n*n*n) = (n*n*n*(n*n*n-1))/2 在n*n*n个立方块中任选两个组合
然后减去邻接4个点的情况
4个点邻接只会出现在两个立方块有公共平面的情况
我们可以考虑4种情况,用a[4]数组保存
8个角上的立方块 , 每个都有3个立方块和其邻接
12个棱上(除去顶角) , 共有12*(n-2) 个立方块 , 每个有4个立方块邻接
6个面上(除去棱) , 共有6*[n*n - 4(n-1)] 个立方块,每个有5个立方块和其邻接
内部,视野所不可到达的中心 , 共有(n-2)^3个立方块,每个有6个立方块邻接
把上述四种情况一加记得除以2,因为你和我邻接与我和你邻接是重复的
最后sum减去它就是结果
1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 int a[4] , sum; 6 7 int get(int n) 8 { 9 int t = n*n*n; 10 sum = t*(t-1) / 2; 11 a[0] = 8 * 3; 12 a[1] = 12 * (n-2) * 4; 13 a[2] = 6 * (n*n - 4*(n-1)) * 5; 14 a[3] = (n-2)*(n-2)*(n-2)*6; 15 sum -= (a[0]+a[1]+a[2]+a[3]) / 2; 16 return sum; 17 } 18 19 int main() 20 { 21 int n; 22 while(~scanf("%d" , &n)){ 23 if(n == 1) 24 puts("0"); 25 else{ 26 int ans = get(n); 27 printf("%d\n" , ans); 28 } 29 } 30 return 0; 31 }
我还在坚持,我还未达到我所想,梦~~一直在