洛谷P3799 妖梦拼木棒 题解

//简单的思路:四根必有两根相同,所以咱们就先选两根组合成第三根,确定另外相同的两根的长度
//分为两种情况,一、预选两根相同长度。二、预选两根不同长度。
//所有情况是预选*(确定的另外两根)
#include
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;
}

你可能感兴趣的:(洛谷刷题,c++,算法)