HDU 1220

本文探讨了将边长为n的正方体分割成1*1*1的小正方体后,寻找任意两个小正方体间最多共享2个点的组合数问题。采用逆向思维简化计算过程,通过排除四点共面的情况来得出最终答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值