首页 > 代码库 > HDU 1220 简单数学题
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\n" , ans);28 }29 }30 return 0;31 }
HDU 1220 简单数学题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。