//简单的思路:四根必有两根相同,所以咱们就先选两根组合成第三根,确定另外相同的两根的长度
//分为两种情况,一、预选两根相同长度。二、预选两根不同长度。
//所有情况是预选*(确定的另外两根)
#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;
}
洛谷P3799 妖梦拼木棒 题解
于 2022-05-04 22:11:47 首次发布