题目背景
上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。
题目描述
有n根木棒,现在从中选4根,想要组成一个正三角形,问有几种选法?
输入格式:
第一行一个整数n
第二行n个整数,a1,a2,……an(0
输出格式:
一行一个整数,对1e9+7取模
输入输出样例
输入样例#1:
4 1 1 2 2
输出样例#1:
1
说明
对于30%的数据 N<=5000
对于100%的数据 N<=100000
Code
组合排列题
#include <iostream>
#include <cstdio>
#define C1(num) (num)
#define C2(num) ((num)*((num)-1)/2)
#define Mod 1000000007
using namespace std;
int n;
long long num[5005];
long long sum;
int main()
{
scanf("%d",&n);
int using_t;
for(int i=1;i<=n;i++)
{
scanf("%d",&using_t);
num[using_t]++;
}
for(int i=2;i<=5000;i++)
{
for(int j=1;j<=i/2;j++)
//由于题目要求4根火柴棒,所以j只能到i/2,j+j=i。
{
int k=i-j;
long long nowans=1;
if(k!=j)
{
if(num[i]>=2 && num[j]>=1 && num[k]>=1)
{
nowans*=(C2(num[i]) % Mod);
nowans%=Mod;
nowans*=(C1(num[j]) % Mod);
nowans%=Mod;
nowans*=(C1(num[k]) % Mod);
nowans%=Mod;
sum+=nowans;
}
}
else
{
if(num[i]>=2 && num[j]>=2)
{
nowans*=(C2(num[i]) % Mod);
nowans%=Mod;
nowans*=(C2(num[j]) % Mod);
nowans%=Mod;
sum+=nowans;
}
}
sum%=Mod;
}
}
printf("%d",sum);
}