Leetcode.858 镜面反射

news/2025/2/22 4:43:37/

题目链接

Leetcode.858 镜面反射 Rating : 1881

题目描述

有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2。

正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q

返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。

示例 1:

在这里插入图片描述

输入:p = 2, q = 1
输出:2
解释:这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。

示例 2:

输入:p = 3, q = 1
输入:1

提示:

  • 1<=q<=p<=10001 <= q <= p <= 10001<=q<=p<=1000

解法:数论

我们注意到光线每射出一次,水平距离移动 ppp,垂直距离移动qqq

由于题目保证了,光线经过若干次射出之后,一定会遇到一个接收器。

假设光线共射出了 kkk 次,那么光线在垂直方向移动的距离 kqkqkq 一定是 ppp 的倍数。因为这是一个边长为 ppp 的正方形房间,接收器的位置从垂直方向上看都是 ppp 的倍数。

因为 kqkqkq 肯定是 qqq 的倍数,这里同时也是 ppp 的倍数,所以我们只需要让 kqkqkqpppqqq 的 最小公倍数 lcm(p,q)lcm(p,q)lcm(p,q) 即可,kq=lcm(p,q)kq = lcm(p,q)kq=lcm(p,q),k=lcm(p,q)/qk = lcm(p,q) / qk=lcm(p,q)/q

我们可以通过 kkk 的奇偶性来判断,光线的终点是左侧还是右侧。如果 kkk 是奇数,那么说明光线是指向右侧的,即接收器只可能是 0和10 和 101;如果 kkk 是偶数,那么说明光线是指向左侧的,即接收器只可能是 222

在这里插入图片描述

我们可以通过 n=lcm(p,q)/pn = lcm(p,q) / pn=lcm(p,q)/p 的奇偶性来判断,光线的终点是上方还是下方。如果 nnn 是奇数,那么说明光线是上方的,即接收器只可能是 2和12 和 121;如果 nnn 是偶数,那么说明光线是下方的,即接收器只可能是 000

在这里插入图片描述

总结:

  • n和kn 和 knk 同时为奇数时,光线的落点是在右上方,接收器只能是 111
  • kkk 是奇数时,光的落点是在右侧,接收器是 000
  • kkk 是偶数时,光的落点时在左侧,接收器是 222

时间复杂度: O(log(max(p,q)))O(log(max(p,q)))O(log(max(p,q)))

C++代码:

class Solution {
public:int mirrorReflection(int p, int q) {int lc = lcm(p,q);int k = lc / q , n = lc / p;k %=2 , n %= 2;if(k == 1 && n == 1) return 1;return k == 1 ? 0 : 2;}
};

http://www.ppmy.cn/news/42681.html

相关文章

IO流基础

目录 1.FileOutPutStream字节输入流 1.1FileOutPutStream使用 1.1.1创建对象 FileOutPutStream fos new FileOutPutStream("路径或者File对象")&#xff1b; 1.1.2.写数据 调用write方法&#xff0c;参数是int类型&#xff0c;但传入文件中是asci…

C++ 23 实用工具(二)绑定工具

C 23 实用工具&#xff08;二&#xff09;绑定工具 Adaptors for Functions std::bind、std::bind_front、std::bind_back和std::function这四个函数非常适合一起使用。 其中&#xff0c;std::bind、std::bind_front和std::bind_back可以让您即时创建新的函数对象&#xff0c…

计及调度经济性的光热电站储热容量配置方法

目录 1 主要内容 目标函数 光热电站能量传递过程 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序复现《计及调度经济性的光热电站储热容量配置方法》模型&#xff0c;综合考虑火电机组发电成本、光热发电并网消纳的环境效益和运行维护成本、系统旋转备用成本等调度…

JAVA数据结构之顺序表、单向链表及双向链表的设计和API实现

一、顺序表 顺序表在内存中是数组的形式存储 类名SequenceList构造方法SequenceList(int capacity)&#xff1a;创建容量为capacity的SequenceList对象成员方法1. public void clear()&#xff1a;空置线性表 2. public boolean isEmpty()&#xff1a;判断线性表是否为空&…

IO多路复用机制详解

高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有四种&#xff1a; &#xff08;1&#xff09;同步阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;即传统的IO模型。 &#xff08;2&#xff09;同步非阻塞IO&#xff08;Non-blo…

uniapp中canvas绘制图片内容空白报错原因总结

uniapp中canvas绘制图片内容空白报错原因总结&#xff0c;看完需要10分钟 问题图: 效果图&#xff1a; 目录 &#x1f9e8;&#x1f9e8;&#x1f9e8;首先定义画布canvas canvas画布初始值没有&#xff0c;导致没有绘制成功 &#x1f9e8;&#x1f9e8;&#x1f9e8;2.绘制图…

【程序员面试】最全指南,如何准备,如何投递,以及面试攻略大全分享!

今天我们继续来分享秋招 大家对怎么找到心仪的offer心里没底 于是我这一节来说说这一块 这一节的话主要有7个小点 第一个就是秋招为什么重要 第二个是应该去哪里找信息 第三个是你该怎么去投递信息 第四个是你应该做什么准备 第五个就是面试技巧 第六个就是资料大全第七个就是总…

【简陋Web应用3】实现人脸比对

文章目录&#x1f349; 前情提要&#x1f337; 效果演示&#x1f95d; 实现过程1. utils.py2. compare.html3. forms.py4. insightface_api.py5. app.py&#x1f345; 记录1. Bugs1.1 cv2.imshow()报错1.2 insightface人脸检测标注框错乱(&#x1f4a2;)2. 杂记&#x1f33e; 小…