博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3799 妖梦拼木棒 (组合数学)
阅读量:5335 次
发布时间:2019-06-15

本文共 1202 字,大约阅读时间需要 4 分钟。

题目背景

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

题目描述

有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
using namespace std;const int maxn=100008;#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=1;i<=n;i++) { scanf("%lld",&a[i]); num[a[i]]++; maxl=max(a[i],maxl); } for(int i=2;i<=maxl;i++) { if(num[i]>=2) { for(int j=1;j<=(i/2);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<
<

 

 

转载于:https://www.cnblogs.com/Kv-Stalin/p/9085556.html

你可能感兴趣的文章
Code Snippet
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>