洛谷P3799 妖梦拼木棒
题目背景
上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。
题目描述
有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,可以用一个桶存下
枚举两根短的木棒的长度就可以了
#include<iostream> #include<cstdio> #define mod 1000000007 #define C(i) ((1LL*i*(i-1)/2)%mod) int b[5010],n,mx; long long ans; using namespace std; int main(){ scanf("%d",&n);int x; for(int i=1;i<=n;i++){ scanf("%d",&x); b[x]++;mx=max(mx,x); } for(int i=1;i<=mx;i++){ for(int j=i;j<=mx;j++){ if(i+j>mx)break; if(i==j)ans=(ans+1LL*C(b[i])*C(b[i+j])%mod)%mod; else if(b[i]>=1&&b[j]>=1&&b[i+j]>=2) ans=(ans+(1LL*b[i]*b[j]*C(b[i+j]))%mod)%mod; } } cout<<ans; }