题意
n个木棍,选出4根拼出一个正三角形。(4根木棍必须全部使用)
思考
我这种菜鸡型选手很惨,连这种题目的做法都没有想出来。。。
首先木棍长度是一个很关键的数据 (n<=5000)
其次仔细思考的话 会发现 4根木棍拼成正三角形 必须要2根木棍相等.
那么解题思路就有了。
#include <cstdio> #include <algorithm> typedef long long ll; const ll MOD = 1000000007; ll Bucket[50055],Out; int n; int main(){ scanf("%d",&n); while(n--){ int x; scanf("%d",&x); Bucket[x]++; //bucket 记录 x这个数字有多少个 } //枚举最短的两根 因为最短 所以需要拼接 for(int i=1;i<=5000;i++){ for(int j=i;j<=5000;j++){ if(i+j>5000) break; if(i==j){ if(Bucket[i]>=2 && Bucket[i<<1]>=2){ //(C(i,2)%MOD*C(i+j,2)%MOD)%MOD Out=( Out+((Bucket[i]*(Bucket[i]-1)/2)%MOD)*((Bucket[i<<1]*(Bucket[i<<1]-1)/2)%MOD) )%MOD; } } else{ //(C(i,1)*C(j,1)%MOD*C(i+j,2)%MOD)%MOD if(Bucket[i]>=1 && Bucket[i+j]>=2 && Bucket[j]>=1){ Out=( Out+((Bucket[i+j]*(Bucket[i+j]-1)/2)%MOD)*(Bucket[i]*Bucket[j]%MOD) )%MOD; } } } } printf("%lld\n",Out); return 0; }