妖梦拼木棒

题目背景

上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。

题目描述

有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 }

 

posted @ 2019-09-07 14:49  GTR_PaulFrank  阅读(231)  评论(0编辑  收藏  举报