杨辉三角形(蓝桥杯,acwing)

题目描述:

下面的图形是著名的杨辉三角形:

QQ截图20210423150438.png

如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:

1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ...

给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?

输入格式:

输入一个整数 N。

输出格式:

输出一个整数代表答案。

数据范围:

对于 20% 的评测用例,1≤N≤10;
对于所有评测用例,1≤N≤1e9。

输入样例:

6

输出样例:

13

这个图是来自acwing的东风祝酒的图片

分析步骤:

  第一:理清思路:

  1. 众所周知,杨辉三角中华瑰宝,他这个三角型是对称的,如果我们要求出哪个点是第一次出现的那么一定是在这个三角形的左边!我们可以把右半部分删掉,完全不用考虑。这是本题目第一个特点。

  2. 现在我们再斜着看一看,把斜着的看做一个序列。第一行数坐标就是(0,0),第二行从左到右就是(1,0),(1,1).....以此类推。我们再看到中间紫色的这一列数值永远就是C2k^k并且永远是这个数最大,我们就可以从这个数开始找起。而且题目中说到了N最大就是1e9,那么C34^17>1e9 ; C32^16<1e9所以我只需要找前面16个斜行就行了这是本题的第二个特点。

  3. 我们现在想想,如果一个一个去找的话速度太慢了。因为序列的单调的这一眼就能看出来,而且我们需要找一个特定的,在这个值的左边就会太小了,在这个值的右边就会太大了,就可以将其分为两个部分这就符合了我们二分的特点,因此我们直接从中间对称轴倒序二分找起即可!这就是本题的第三个特点。

  4. 大家一定要好好看看这图,仔细去理解!!

  第二:书写主函数,构建整体框架:

  1. 因为我们分析过了我们只需要枚举前16行就可以了,那么我们倒序枚举,检查一下这一行是不是我们想要的,是的话就代表找到了,就break退出。

int main()
{cin >> n;for (int k = 16; ; k -- )if (check(k))break;return 0;
}

  第三:书写check函数:

  1. 现在我们就入了其中的一个序列进行检查,运用二分的方法去查找。

  2. 首先我们要确定二分的左节点和右节点,所以我们定义LL l = k * 2, r = n;为什么这么定义呢?因为:在一个序列之中我们最小的值是上图中紫色的那一些数,这些数的特点是C2k^k,所以定义他们为最小的左边界节点,那么右边界节点就应该是最大的那个数字了,但是我们的杨辉三角是无穷的所以我们应该只需要找到题目给出的那个数字就可以了,那么这个数一定会在Cn^1的这个地方出现,因为这个值就是N。所以我们把右边界定义为n。

  3. 如果l比r都要大就直接返回false不可能在这一行因为这个数一定比这一序列的第一个数要小,就代表答案的位置在更靠前的序列之中。

  4. 进入while循环,计算我们的mid值计算我们的Cmid^k让这个数和n比较大小。如果这个数比n要大或等于的话就代表答案有可能在mid左边也就是更小的那一边,所以我们把r赋值给mid。反之答案比n更小的话,那么答案一定在mid的右边也就是更大的一边,就让mid+1赋值给l。

  5. 经过了一轮的while循环判断之后,再去计算一下Cr^k看看和答案是否一致,如果不一致就是错

  6. 最终输出位置即可。

bool check(int k)
{LL l = k * 2, r = n;if (l > r) return false;while (l < r){LL mid = l + r >> 1;if (C(mid, k) >= n) r = mid;else l = mid + 1;}if (C(r, k) != n) return false;cout << r * (r + 1) / 2 + k + 1 << endl;return true;
}

  第四:书写计算组合数的函数:

  1. 我们计算组合数直接暴力做就可以,利用双指针一起去求解

LL C(int a, int b)
{LL res = 1;for (int i = a, j = 1; j <= b; i --, j ++ ){res = res * i / j;if (res > n) return res;}return res;
}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;int n;LL C(int a, int b)
{LL res = 1;for (int i = a, j = 1; j <= b; i --, j ++ ){res = res * i / j;if (res > n) return res;}return res;
}bool check(int k)
{LL l = k * 2, r = n;if (l > r) return false;while (l < r){LL mid = l + r >> 1;if (C(mid, k) >= n) r = mid;else l = mid + 1;}if (C(r, k) != n) return false;cout << r * (r + 1) / 2 + k + 1 << endl;return true;
}int main()
{cin >> n;for (int k = 16; ; k -- )if (check(k))break;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保姆级教程带你实现HarmonyOS手语猜一猜元服务(一)

&#x1f680;前言 最近HarmonyOS NEXT大火&#xff0c;这个纯血鸿蒙吸引力了大家的关注。虽然现在还没面向个人开发者开放&#xff0c;但我们可以基于最新的API9及开发工具来尝试开发鸿蒙新的应用形态——元服务。来体验下未来在HarmonyOS NEXT上实现的应用开发。 HarmonyOS…

算法学习 | day38/60 零钱兑换/组合总和IV

今天主要是完全背包的一个专题&#xff0c;完全背包相对于 01 背包&#xff0c;主要区别在于物品可以取出无限次&#xff0c;其他关于 dp 的状态定义和状态转移都是一样的&#xff0c;体现在代码上&#xff0c;最重要的是遍历的一个先后顺序以及遍历开始的位置。 一、题目打卡…

Canal的使用场景!!!

1、保持redis和mysql连接的一致性&#xff1a;通常使用延迟双删功能&#xff08;具有弊端&#xff09; 解决方案&#xff1a;可以使用canal监听数据库的变化&#xff08;删改&#xff09;&#xff0c;一旦出现此类操作&#xff0c;立即删除redis中的对应数据&#xff0c;直至下…

从0到1实现RPC | 08 异常码和异常超时

定义RpcException RpcException继承RuntimeException&#xff0c;定义特定错误码&#xff0c;专用于远程过程调用过程中产生的异常。 X: 技术类异常Y: 业务类异常Z: 未知异常 在使用时&#xff0c;使用rpc专用的异常错误码&#xff0c;方便定位排查。 超时异常重试 在发生网…

【汇编语言实战】统计个数(创新版)

内存中有10个分布在0至100内的正整数&#xff0c; 求小于60的数的个数num1&#xff0c;大于或等于60且小于80的数的个数num2&#xff0c;大于或等于80且小于100的数的个数num3 C语言描述该程序流程&#xff1a; #include <stdio.h> int main() {int a[]{1, 20, 95, 32,…

基于Java+SpringBoot+Vue游戏账号估价交易平台(源码+文档+部署+讲解)

一.系统概述 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对游戏账号估价交易的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用…

基于SSM的课程进度管理系统的设计与实现

摘要&#xff1a; 在信息技术飞速发展的当下&#xff0c; 借助互联网平台以及功能性系统的支持&#xff0c;人们获取信息以及信息整合的通道越来越多元化。系统和平台帮助人们实现了信息的共享&#xff0c;同时帮助人们更加直观的看到成果和过程的变动。以课程进度管理为例&…

服务器数据恢复—ext3文件系统下raid5数据恢复案例

服务器数据恢复环境&故障情况&#xff1a; 某企业光纤存储上有一组由16块硬盘组建的raid5阵列。管理员发现该光纤存储上的卷无法挂载&#xff0c;经过检查发现raid5阵列中有2块硬盘离线&#xff0c;于是联系我们数据恢复中心要求数据恢复工程师到现场恢复服务器存储上的数据…

Canal--->准备MySql主数据库---->安装canal

一、安装主数据库 1.在服务器新建文件夹 mysql/data&#xff0c;新建文件 mysql/conf.d/my.cnf 其中my.cnf 内容如下 [mysqld] log_timestampsSYSTEM default-time-zone8:00 server-id1 log-binmysql-bin binlog-do-db mall # 要监听的库 binlog_formatROW2.启动数据库 do…

数据交换格式

一、什么是数据交换格式 在计算机的不同程序之间&#xff0c;或者不同的编程语言之间进行交换数据&#xff0c;也需要一种大家都能听得懂得‘语言’&#xff0c;这就是数据交换格式&#xff0c;它通过文本以特定的形式来进行描述数据。 二、常用的几种数据交换格式 客户端常…

C++ //练习 11.32 使用上一题定义的multimap编写一个程序,按字典打印作者列表和他们的作品。

C Primer&#xff08;第5版&#xff09; 练习 11.32 练习 11.32 使用上一题定义的multimap编写一个程序&#xff0c;按字典打印作者列表和他们的作品。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************…

Vue2 —— 学习(五)

一、生命周期 &#xff08;一&#xff09;引入案例 我们想让一行文字按一定频率逐渐变得透明 1. Vue 实例外写法 函数写在 Vue 实例外面也能实现但是不推荐 <body><div id"root"><h2 :style"{opacity}">欢迎学习Vue</h2><…

大型连锁企业异地组网稳定性提升指南

随着时代的发展&#xff0c;连锁企业在网络方面面临着越来越多的挑战。这些企业在不同的地理位置设有分支机构和门店&#xff0c;可能是同城也可能是异地&#xff0c;因此需要确保各个地点之间的网络连接稳定可靠。然而&#xff0c;由于不同地区网络基础设施、延迟和带宽等方面…

代码随想录:栈与队列4-6

20.有效的括号 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一…

打卡--MySQL8.0 四 (索引及执行计划)

一、索引的创建与使用 1、索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 &#xff08;1&#xff09;从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。 &#xff08;…

【测试开发学习历程】python迭代、可迭代对象、迭代器、生成器

1 迭代Iteration 迭代Iteration&#xff1a;所谓迭代就是重复运行一段代码语句块的能力&#xff0c;就好比在一个容器中进行一层一层遍历数据&#xff0c;在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素&#xff0c;直到容器中没有元素为止。迭代迭代&…

【R基础】一组数据计算均值、方差与标准差方法及意义

【R基础】一组数据计算均值、方差与标准差方法及意义 均值、方差与标准差是用来描述数据分布情况 均值&#xff1a;用来衡量一组数据整体情况。 数据离散程度度量标准&#xff1a; 方差&#xff08;均方&#xff0c;s^2&#xff0c;总体参数&#xff0c;离均差平方和&#…

AI大模型原理科普(深度好文)

目录 认识AI大模型家族 AI是什么&#xff1f; 机器学习是什么&#xff1f; 机器学习有哪些分支&#xff1f; 什么是强化学习&#xff1f; 深度学习属于哪一类学习&#xff1f; 生成式AI和深度学习是什么关系&#xff1f; 大语言模型是什么&#xff1f; 所有大语言模型…

【Java】HashMap 源码阅读

HashMap 源码阅读 HashMap 简介 HashMap 主要用来存放键值对&#xff0c;实现了基于哈希表的 Map 接口&#xff0c;非线程安全。 HashMap 可以存放 null 的 key 和 null 值&#xff0c;但 null 作为 key 只能有一个&#xff0c;null 作为 value 可以有多个。 HashMap 有两个…

BFS广度优先搜索

import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您…