题目背景

上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。

题目描述

有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

Solution

很显然这是个数学水题,我都会做...

因为是要找 4 根小木棍.

所以很显然这个正三角形的组成是:

n1 , n2 , n1+n2 , n1+n2;

所以公式就是 :

Ansn = C1num [ j ]*C1num [ n - j ]*C2num [ n ]

其中,num数组代表当这种长度的木板所有的数量.然后 j 为 从 1 枚举到 n/2 .

然后求解即可.

代码

 
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
#define ll long long
#define mo 1000000007
#define C1(x) (x)
#define C2(x) ((x)*((x)-1)/2)
ll n,maxl,ans;
ll num[maxn],a[maxn];
int main()
{
scanf("%lld",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
num[a[i]]++;
maxl=max(a[i],maxl);
}
for(int i=;i<=maxl;i++)
{
if(num[i]>=)
{
for(int j=;j<=(i/);j++)
{
ll k=i-j;
if(k!=j)
ans+=(C1(num[j])%mo)*(C1(num[k])%mo)*C2(num[i])%mo;
else
ans+=(C2(num[j])%mo)*(C2(num[i])%mo)%mo;
ans%=mo;
}
}
}
cout<<ans<<endl;
}

最新文章

  1. Python(六)面向对象、异常处理、反射、单例模式
  2. amazeui折叠面板智能化展开
  3. UITabBarController
  4. int数组转string数组和int数组转string中间用逗号隔开
  5. 红帽Linux 配置VNC桌面远程工具
  6. Functions
  7. final,static
  8. 性能测试之Windows常见性能计数器
  9. https://github.com/mlzboy/spider-impl.git
  10. Android开发之自定义圆形的ImageView的实现
  11. 神器-Sublime Text 3 代码编辑器安装与使用
  12. ONLY三行脚本 SQL数据恢复到指定时间点
  13. SASL - 简单认证和安全层
  14. Unity3d获取游戏对象的几种方法
  15. 【转】ATA Secure Erase
  16. Python 数据分析4
  17. [Swift]LeetCode687. 最长同值路径 | Longest Univalue Path
  18. mac 回车键、空格键失灵(非物理原因)解决方法
  19. curl常用功能
  20. @RequestMapping中method的默认值是什么?

热门文章

  1. 微软爆料新型系统,Windows7,Windows10强势来袭
  2. (十二)maven之nexus仓库的基本用法
  3. linux下怎么修改mysql的字符集编码
  4. websphere7.0异常:SRVE0255E: 尚未定义要处理 /wcm 的 Web 组/虚拟主机
  5. selenium-元素的定位
  6. 有C++特色的极乐净土
  7. ios UITableViewCell重用问题
  8. passive event 解决方法
  9. (58)zabbix网络拓扑图配置network map
  10. 五:SQL语句中的数据类型