(题外音:因为组合数学不咋样,写下来以防忘记)
题目描述
有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法?
答案对 10^9+7 取模。
输入格式
第一行一个整数 nn。
第二行往下 n 行,每行 1个整数,第 i个整数 ai 代表第 i 根木棒的长度。
输出格式
一行一个整数代表答案。
输入输出样例
输入 #1:
4 1 1 2 2
输出 #1
1
有了这些铺垫以后,我们再来看这道题
要从nn根木棒中选出4根,使他们能组成一个正三角形。
简单的来说,
就是先选出两根一样的,在选出两根使这两根的长度之和与先前选出的相同
2022/7/28
#include<bits/stdc++.h>
using namespace std;
int n,ans,num[5010],maxx,minn;
int mod=1e9+7;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&t);
maxx=max(maxx,t);
minn=min(minn,t);
num[t]++;
}
for(int i=minn+1;i<=maxx;i++)
{
if(num[i]>=2)
{
for(int j=minn;j<=i/2;j++)
{
if(j!=i-j)//两根木棒不一样长
ans+=num[i]*(num[i]-1)/2*num[j]*num[i-j]%mod;
else if(num[j]>=2 && j*2==i)//两根木棒一样长
ans+=num[i]*(num[i]-1)/2*num[i/2]*(num[i/2]-1)/2%mod;
}
}
ans=ans%mod;
}
cout << ans <<endl;
return 0;
}