首页 > 其他 > 详细

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

时间:2020-04-23 13:42:50      阅读:71      评论:0      收藏:0      [点我收藏+]

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

基本思路:

题里面说,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;
}

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!