【题解】【枚举,数学】——小 Y 拼木棒

【题解】【枚举,数学】——小 Y 拼木棒

  • 小 Y 拼木棒
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
    • 提示
        • 数据规模与约定
  • 1.题意简述
  • 2.思路解析
  • 3.AC代码

前置知识:排列组合,暴力枚举基础知识。

小 Y 拼木棒

通往洛谷的传送门

题目背景

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

题目描述

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

答案对 1 0 9 + 7 10^9+7 109+7 取模。

输入格式

第一行一个整数 n n n

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

输出格式

一行一个整数代表答案。

输入输出样例

输入 #1

4 
1
1
2
2

输出 #1

1

提示

数据规模与约定
  • 对于 30 % 30\% 30% 的数据,保证 n ≤ 5 × 1 0 3 n \le 5 \times 10^3 n5×103
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 5 1 \leq n \le 10^5 1n105 1 ≤ a i ≤ 5 × 1 0 3 1 \le a_i \le 5 \times 10^3 1ai5×103

关于标题:因为一些不可抗力的原因,名称进行了更改。深表歉意。

1.题意简述

    找出四个数 a , b , c , d a,b,c,d a,b,c,d,求出有多少组这样的数使得 a = b = c + d ( c ≤ d ) a=b=c+d(c\leq d) a=b=c+d(cd)

2.思路解析

    大部分人第一时间想到的就是直接暴力枚举。使用枚举子集的方法,暴力枚举四条木棍的长度然后再判断。但是一看数据范围 n ≤ 1 0 5 n\leq 10^5 n105,那么用 O ( 2 n ) O(2^n) O(2n)的算法显然是不行的。要考虑优化。

    因为组成三角形跟相同长度的木棍有关,首先使用类似于基数排序的方法,用pail[i]储存长度为i的木棍的根数。

    我们可以考虑枚举 a a a,得到其中两根相同长度的木棍的长度(即ab)。然后再枚举c,通过c来算出 d d d。这样只需要 O ( n 2 ) O(n^2) O(n2)的时间复杂度就搞定了。

    枚举 c c c的时候,分两种情况讨论。第一种情况是c=d。这个时候,就相当于从长度为 c c c的木棍里选取两根,与在长度为 a a a的木棍中选取的两根 a a a b b b)组成一个三角形。这不就是计算组合数吗?即 C p a i l [ a ] 2 ∗ C p a i l [ c ] 2 C_{pail[a]}^2*C_{pail[c]}^2 Cpail[a]2Cpail[c]2

    再来看看第二种情况,c!=d。这个时候,就是从长度为c的木棍中选取一根,再从长度为d的木棍中选取一根,与在长度为 a a a的木棍中选取的两根组成一个三角形。即 C p a i l [ a ] 2 ∗ p a i l [ c ] ∗ p a i l [ d ] C_{pail[a]}^2*pail[c]*pail[d] Cpail[a]2pail[c]pail[d]

    现在再来看看如何计算组合数。可以发现,上面的组合数 C n m C_n^m Cnm只计算了 m = 2 m=2 m=2的情况。我们可以据此化简,并将它封装成一个函数。
C n m = n ! m ! ( n − m ) ! C_n^m=\frac{n!}{m!(n-m)!} Cnm=m!(nm)!n!
    代入 m = 2 m=2 m=2得:
n ! 2 ! ( n − 2 ) ! \frac{n!}{2!(n-2)!} 2!(n2)!n!
    展开得:
1 × 2 × 3 × ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ × ( n − 1 ) × n 1 × 2 × 1 × 2 × 3 × ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ × ( n − 3 ) × ( n − 2 ) \frac{1\times2\times3\times······\times(n-1)\times n}{1\times2\times1\times2\times3\times······\times(n-3)\times(n-2)} 1×2×1×2×3×⋅⋅⋅⋅⋅⋅×(n3)×(n2)1×2×3×⋅⋅⋅⋅⋅⋅×(n1)×n
    化简得:
n ( n − 1 ) 2 = n ( n − 1 ) / 2 \frac{n(n-1)}{2}=n(n-1)/2 2n(n1)=n(n1)/2

    为了方便,我们在后续的代码中将其分装成一个宏函数,不要忘记宏函数的特性哦!

注意

  1. 因为我们是使用来存储数据的,所以 a a a应当枚举到最大范围,即 5 × 1 0 3 = 5000 5×10^3=5000 5×103=5000
  2. 根据我们上面的定义 c ≤ d c\leq d cd,为了避免重复, c c c只需要枚举到a/2
  3. 计算的每一步都要确保长为c和长为d的木棍存在,即pail[c]pail[d]为真;
  4. 记得运算中的每一步都要对1e9+7取模。

3.AC代码

#include<bits/stdc++.h>
using namespace std;
#define C(a) ((a)*((a)-1)/2)//计算组合数C(n,2),记得勤加括号
const int mod=1e9+7;
int main()
{int n,pail[5010]={0},cnt=0;//用桶存下木棍的长度 cin>>n;for(int i=1;i<=n;i++){int tmp;cin>>tmp;pail[tmp]++;//放入桶中 }for(int a=2;a<=5000;a++)//从2开始枚举a {for(int c=1;c<=a/2;c++)//c不可能超过a/2{int d=a-c;//随时都要取模if(d==c&&pail[a]>=2&&pail[c]>=2)//c和d相同cnt+=((C(pail[a])%mod)*(C(pail[c])%mod))%mod;else if(d!=c&&pail[a]>=2&&pail[c]&&pail[d])//c和d不相同cnt+=((C(pail[a])%mod)*(pail[c]%mod)*(pail[d]%mod))%mod;cnt%=mod;}}cout<<cnt%mod;return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542730.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue+MySQL的医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会&#xff0c;随着医疗服务需求的不断增长和医疗信息化的快速发展&#xff0c;提升医院管理效率和服务质量成为了医疗行业的核心需求。传统的医院管理模式面临着效率低下、资源分配不均、患者就医体验差等问题。为了应…

图像处理基础知识点简记

简单记录一下图像处理的基础知识点 一、取样 1、释义 图像的取样就是图像在空间上的离散化处理,即使空间上连续变化的图像离散化, 决定了图像的空间分辨率。 2、过程 简单描述一下图象取样的基本过程,首先用一个网格把待处理的图像覆盖,然后把每一小格上模拟图像的各个…

一种求解无人机三维路径规划的高维多目标优化算法,MATLAB代码

在无人机三维路径规划的研究领域&#xff0c;高维多目标优化算法是一个重要的研究方向。这种算法能够同时考虑多个目标&#xff0c;如航迹距离、威胁代价、能耗代价以及多无人机协同性能等&#xff0c;以实现无人机路径的最优规划。 无人机路径规划算法的研究进展表明&#xf…

中国最厉害的改名大师,颜廷利教授的名字来自于国学易经元亨利贞

颜廷利教授&#xff0c;一位源自齐鲁大地山东济南的世界级文化名人&#xff0c;他的名字背后承载着深厚的家族易学传统。在颜廷利教授的童年记忆中&#xff0c;家族长辈常以《易经》中频繁出现的“元、亨、利、贞”四字&#xff0c;寓意四季之变换&#xff0c;将这四个字分别对…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…

使用Stream实现事件流

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了Flutter中的异步操作&#xff0c;本章回中将介绍Flutter中的事件流.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在上一章回中介绍了异步操作相关的内容&#xff0c;本章回中将介绍如何把…

51.字符串比较实例-用户登录

//已知正确的用户名和密码&#xff0c;请用程序实现模拟用户登录 //总共三次机会&#xff0c;登录之后给出相应的提示 import java.util.Scanner;public class 登录 {public static void main(String[] args) {//1.定义两个变量&#xff0c;记录正确的用户名和密码String righ…

【kaggle竞赛】毒蘑菇的二元预测题目相关信息和思路求解代码

毒蘑菇的二元预测 您提供了很多关于不同二元分类任务的资源和链接&#xff0c;看起来这些都是Kaggle竞赛中的参考资料和高分解决方案。为了帮助您更好地利用这些资源&#xff0c;这里是一些关键点的总结&#xff1a; Playground Season 4 Episode 8 主要关注的竞赛: 使用银行…

深入理解 JavaScript 三大作用域:全局作用域、函数作用域、块级作用域

一. 作用域 对于多数编程语言&#xff0c;最基本的功能就是能够存储变量当中的值、并且允许我们对这个变量的值进行访问和修改。那么有了变量之后&#xff0c;应该把它放在哪里、程序如何找到它们&#xff1f;是否需要提前约定好一套存储变量、访问变量的规则&#xff1f;答案…

【线程池】ThreadPoolExecutor应用

ThreadPoolExecutor应用 每一步的坚持与积累,都是铸就高薪和大牛的必经的修炼 哈哈,不吹牛逼了,今天来分享最近在提升中的学习总结,无论是对在职场还是求职,看完,我相信都会有些许的收获和成长 也难得过了一个悠闲点的周末,哈哈哈,一起奥利给!! 本文总纲: 1.为什么要自定义线程…

java8 常用操作案例【经典版】超赞!

目录 一 案例 1.1 对象转list 1.2 过滤对象 1.3 排序 1.4 匹配 1.5 最大值最小值 1.6 拼接字符串 1.7 求和 1.8 分组 1.9 分组求和 1.10 综合案例 一 案例 1.1 对象转list /*** author admin对象转map ; mapper层实体类获取,到业务层转换为DTO,* return void…

《python语言程序设计》2018版第8章18题几何circle2D类(中部)

第一、重新分析 第一-1、我设计的第一模式第一-1-1、遇到的逻辑分析迷雾第一-1-2、无畏挣扎后的无奈 第二-1、我就把你们两个放到一起,第二-2、我的想法 当我看到了这个2个园并且比对. 第一-1、我设计的第一模式 设计一个最抽象的Circle2D类. 这个类只包含一个x,y和circle 这个…

初始C++中的string与迭代

常用的string构造相关类的接口 string类是一个管理字符串的字符数组&#xff0c;string类的出现方便管理我们日常所遇见的&#xff0c;字符名&#xff0c;字符串等等。下面们介绍一下常见的string类接口。 string(); 默认构造&#xff0c;构造空的string类 int main() { …

深度学习电脑独显GPU占用一直0%解决方式

在系统设置里面把硬件加速GPU计划关了 然后重启 再随便跑个模型 打开任务管理器可以看到独显开始工作了 再在GPU1中将3D改成Cuda即可

Vue项目之Element-UI(Breadcrumb)动态面包屑效果 el-breadcrumb

效果预览 需要导航的页面Vue.js 最笨的方法就是在每个需要面包屑的页面中固定写好 <template><div class="example-container"><el-breadcrumb separator="/"

【Linux-基础IO】C语言文件接口回顾 系统文件概念及接口

目录 一、C语言文件接口回顾 C语言基础知识 C中文件操作示例 二、系统文件概念及接口 重定向基本理解的回顾 文件的基本概念 系统调用接口 open read write close lseek 什么是当前路径 一、C语言文件接口回顾 引言&#xff1a;我们并不理解文件&#xff01;从语…

springboot实战学习(7)(JWT令牌的组成、JWT令牌的使用与验证)

接着上篇博客的学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验的基础上&#xff0c;基本完成用户模块的登录接口的主逻辑以及提到了问题&#xff1a;"用户未登录&#xff0c;需要通过登录&#xff0c;获取到令牌进行登录认证&#xff0c;…

TypeError: a bytes-like object is required, not ‘str‘ - 完美解决方法

&#x1f680;TypeError: a bytes-like object is required, not str - 完美解决方法&#x1f4a1; &#x1f680;TypeError: a bytes-like object is required, not str - 完美解决方法&#x1f4a1;摘要引言正文1. 错误背景&#xff1a;字节与字符串的区别&#x1f440;2. 错…

告别ESLint噩梦!轻松几步解决 indent 与 react/jsx-indent-props 的 空格 冲突!

话不多说&#xff0c;直接上代码&#xff0c;下面是截取的一部分 eslint 配置。可以看到我设置了四个空格和标签属性对齐首个。 "rules": {"indent": ["error", 4], // 四个空格"react/jsx-indent-props": ["error", "…

双虚拟机部署php项目

前言 经过前面的学习,我们对分布式部署有了一定的了解,这次我们尝试做些东西 准备 我打算用虚拟机部署一个外联网盘 一台虚拟机安装php另一台安装MySQL,但是之前已经安装过 MariaDB 了,就不打算改了。 通常MariaDB与MySQL兼容性很好,可以作为替代使用。彩虹外链网盘项目…