题解 洛谷P3799 【妖梦拼木棒】

一道水题 (还是做了一个小时,我太菜了

基本思路:

题里面说,4根棍子拼成一个正三角形(等边三角形)

若设这四根棍子长度为\(a,b,c,d\)\(a≥b>c≥d\)

那很容易得到 (真的很容易):

\(a=b=c+d\)

自然,我们只需枚举\(a\)的长度和\(c\)的长度就行了

长度最长才5k,木棍用桶按长度装一下,遍历的时候也方便。

代码要好好看完啊kora

#include <bits/stdc++.h>
#define c1(a) (a)//带参宏定义,本题不必写函数 
#define c2(a) ((a)*((a)-1)/2)
using namespace std;
const int mode=1000000007;
int aaa[5010];//桶 
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);//io流解绑 
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int k;
		cin>>k;
		aaa[k]++;//往桶里扔
	}
	int ans=0;
	for(int a=2;a<=5000;a++)
   {
			for(int c=1;c<=a/2;c++)//c最大只能到a的一半 
			{
				int d=a-c;//把d算出来判定相等 
				if(d!=c&&aaa[a]>=2&&aaa[c]>=1&&aaa[d]>=1)//c d不同 
				{
					ans+=((c2(aaa[a])%mode)*(c1(aaa[c])%mode)*(c1(aaa[d])%mode))%mode;
				}
				else if(d==c&&aaa[a]>=2&&aaa[c]>=2)//c d相同 
				{
					ans+=((c2(aaa[a])%mode)*(c2(aaa[c])%mode))%mode;
				}
				ans%=mode;
			}
	}
	cout<<ans%mode;//多模几次总没问题的 
	return 0;
}

posted @ 2020-04-23 11:48  RemilaScarlet  阅读(175)  评论(0编辑  收藏  举报