洛谷P3799 妖梦拼木棒 题解

该博客探讨了一道数学问题,涉及四根木棍如何组合使得两根木棍之和等于另外两根。通过预选相同或不同长度的木棍,计算所有可能的组合,最终求出总方案数。算法实现包括对每种长度木棍的计数,并考虑组合的条件进行求解。

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

//简单的思路:四根必有两根相同,所以咱们就先选两根组合成第三根,确定另外相同的两根的长度
//分为两种情况,一、预选两根相同长度。二、预选两根不同长度。
//所有情况是预选*(确定的另外两根)
#include<iostream>
using namespace std;
long long int n,arr[5500],temp,sum;
int maxn;
void shuru()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> temp;
		arr[temp]++;//存储长度相同的根数
		if (temp > maxn)
			maxn = temp;
	}
}
int main()
{
	freopen("title.in", "r", stdin);
	shuru();
	for (int i = 1; i <=maxn; i++)
	{
		for (int d = i; d <=maxn; d++)
		{
			if (arr[i]>=1 && arr[d]>=1 && i + d <= maxn && arr[i + d] >= 2)
			{
				if (i==d&&arr[i]>=2)
					sum = sum + arr[i + d]*(arr[i+d]-1) * arr[i]*(arr[i]-1)/4;//预选和确定两根都要在总根数中取两根,所以就是取组合的n取2
				else if(i!=d)
				 sum = sum + arr[i+d]*(arr[i + d] - 1) * arr[i] * arr[d]/2;//不相同则不需要n取2,此处n为每个长度的根数
			}	
		}
	}
	cout << sum%(int)(1e9+7);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值