当前位置: 首页 > news >正文

P3799 小 Y 拼木棒

题目背景

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

题目描述

有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法?

答案对 109+7 取模。

输入格式

第一行一个整数 n。

第二行往下 n 行,每行 1 个整数,第 i 个整数 ai​ 代表第 i 根木棒的长度。

输出格式

一行一个整数代表答案。

输入输出样例

输入 #1复制

4 
1
1
2
2

输出 #1复制

1

说明/提示

数据规模与约定
  • 对于 30% 的数据,保证 n≤5×103。
  • 对于 100% 的数据,保证 1≤n≤105,1≤ai​≤5×103

        卡了好长时间终于AC了呜呜呜。

题目分析

        这道题不能使用dfs枚举每一种情况会超时,别问我怎么知道的。

        改变思路,我们侧重于题目本身进行分析。要想利用4个木棒得到一个正三角形,首先得有两个相同的木棒,并且这个长度的木棒会比另外两个木棒的长度长。我们合理使用数组来存储每个长度木棒的数量,将数组a开到满足题目的最大值。

        从大到小进行遍历,如果它的值a[i]大于等于2,则在1到i/2的范围内寻找满足题目情况的值。

        这里使用到的还是重要的组合公式。两种物品分别有m和n个,每种里面都选择一种,则有m * n种组合。

这里给出一种关于没有顺序的cnm的计算代码(边乘边除法):

ll C(ll n, ll m) {
   ll ans = 1;
   for (ll i = 1; i <= m; i++) {
       ans = ans * (n - m + i) / i;
   }
   return ans;
}

对于m == 2的情况我们直接可以返回n * (n - 1) / 2;

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9 + 7;
int n, a[5005] = {0};


int zuhe(int m){
	if (m < 2) return 0;
	return (ll)m * (m - 1) / 2 % mod;;
}
int main()
{
	ll sum = 0;
    cin >> n;
    int tmp;
    for (int i = 0; i < n; i++){
    	cin >> tmp;
    	a[tmp]++;
	}

	for(int i = 5001; i > 1; i--){
		if(a[i] <= 1)continue;
		else{// >= 2
			int cm2 = zuhe(a[i]);
			for(int j = 1; j <= i / 2; j++){//找匹配的数子
				if(j != i - j){
					if(a[j] > 0 && a[i - j] > 0){//可以相加的两个数都是大于0的
						sum += a[j] * a[i - j] * cm2 % mod;
						sum %= mod;
					}
				}else{// j == i - j
					if(a[j] > 1)sum += zuhe(a[j]) * cm2 % mod;
					sum %= mod;
				}

			}
		}
		sum %= mod;
	}
	cout << sum%mod;
}

相关文章:

  • 内网渗透-Linux提权之suid提权
  • 论文精读:NC CoNb3S6拓扑能斯特效应 附Peer Review
  • L2-050 懂蛇语(测试点1)
  • 微软推出首款量子计算芯片Majorana 1
  • MySQL中的索引
  • YOLOv11实战电力设备缺陷检测
  • VB.NET Asp.Net Core模板WebAPI应用-宝塔面板Linux系统通过Docker部署
  • 常见的 JavaScript 框架和库
  • OpenDriveVLA:通过大型视觉-语言-动作模型实现端到端自动驾驶
  • Qt Quick 与 Qt 版本匹配关系
  • 前后端开发的未来趋势
  • 内容中台:全域信息协同新引擎
  • RCE漏洞的小点总结
  • 高并发内存池:原理、设计与多线程性能优化实践
  • 【Kubernetes】Kubernetes 如何管理存储?PV 和 PVC 是如何工作的?
  • C++——清明
  • QScrollArea 内部滚动条 QSS 样式失效问题及解决方案
  • JavaScript逆向WebSocket协议解析与动态数据抓取
  • 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter11-实践:基于onnxruntime的手写数字识别库
  • LENOVO联想ThinkBook 16 G6 ABP(21KK)恢复预装OEM原厂Win11系统镜像
  • 四川住房和城乡建设九大员网站/怎么建立网站的步骤
  • 团购手机网站怎么做/网络营销主要做些什么工作
  • 网站建设策目标/公关公司排行榜
  • 产品销售型企业网站有哪些/赣州seo外包怎么收费
  • pc和移动端网站跳转/近期时政热点新闻20条
  • 网络系统部/seo网站管理