HDU 1220 简单数学题

题目大意是

在魔方上找到有多少对小立方块它们之间连接的点不超过两个

因为任意两个立方块之间相连的点就只有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
" , ans);
28         }
29     }
30     return 0;
31 }
原文地址:https://www.cnblogs.com/CSU3901130321/p/4184370.html