题解 洛谷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;
}

原文地址:https://www.cnblogs.com/IzayoiMiku/p/12759755.html