妖梦拼木棒
题目背景
上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。
题目描述
有n根木棒,现在从中选4根,想要组成一个正三角形,问有几种选法?
输入格式
第一行一个整数n
第二行n个整数,a1,a2,……an(0<ai<=5000),代表每根木棒的长度。
输出格式
一行一个整数,对1e9+7取模
输入输出样例
输入 #1
4 1 1 2 2
输出 #1
1
说明/提示
对于30%的数据 N<=5000
对于100%的数据 N<=100000
by-szc
【解题思路】
4个木棒拼正三角形,就是2根一样长的和另外2根拼起来
木棒长度最大5000,可以用一个桶存下
枚举两根短的木棒的长度就可以了
【code】
1 #include <cstdio>
2 #include <iostream>
3 #include <algorithm>
4 using namespace std;
5 const int mod=1000000007;
6 int n,ans,Maxn=-1<<30;
7 int a[100005];
8 int cnt[5005];
9 inline int C1(int x){
10 return x;
11 }
12 inline int C2(int x){
13 return x*(x-1)/2;
14 }
15 int main(){
16 scanf("%d",&n);
17 for(register int i=1;i<=n;i++){
18 scanf("%d",&a[i]);
19 cnt[a[i]]++;
20 if(a[i]>Maxn)Maxn=a[i];//桶计数
21 }
22 for(register int i=1;i<=Maxn;i++){
23 if(cnt[i]>=2){
24 int t=C2(cnt[i])%mod;
25 for(register int j=1;j<=(i/2);j++){//枚举两根短木棒,剪枝
26 if(j*2==i&&cnt[j]>=2)
27 ans=(ans+C2(cnt[j])*t)%mod;
28 else if(j*2!=i&&cnt[j]>=1&&cnt[i-j]>=1)
29 ans=(ans+C1(cnt[j])*t%mod*C1(cnt[i-j])%mod)%mod;//组合数计算
30 }
31 }
32 }
33 printf("%d\n",ans%mod);
34 return 0;
35 }