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

2023杭电多校第三场 1012.Noblesse Code

传送门:Vjudge

前题提要:一道挺有意思的数论题.赛时对于这道题没什么想法,但是赛后细品之后其实感觉也就那么一回事.但是这种 更相损减术与辗转相除法 相转化的题目还是有点典的,需要好好消化一下.

首先看完题目.我们需要考虑的是 ( A , B ) (A,B) (A,B) ( a , b ) (a,b) (a,b)的相互转化关系.其中转化方法是使用类似于更相损减术的方法.显然.我们是不能直接转化的,因为对于更相损减术来说,如果 ( A , B ) (A,B) (A,B)两个数相差太大,那么需要的复杂度就会爆炸.所以我们得考虑一种更有效率的方法.

因为是更相损减术,所以我们联想到它的好兄弟,辗转相除法.辗转相除法可以很好的解决更相损减术过程中不断的单向减少的过程(也就是不断的变为 ( a , b − a ) (a,b-a) (a,ba)).但是使用辗转相除法处理我们的 ( A , B ) (A,B) (A,B)的话,显然会丢失中间的一些数对.就比如 ( 9 , 3 ) (9,3) (9,3),我们使用辗转相除法,进行一次就会得到 ( 0 , 3 ) (0,3) (0,3),此时我们会丢失中途本来可以得到的 ( 6 , 3 ) , ( 3 , 3 ) (6,3),(3,3) (6,3),(3,3)等数对,并且这些数对都是符合题意的,那么我们该怎么解决这种问题呢.

考虑我们的辗转相除法是解决更相损减术固定一个值,另一个值不断减少的过程,所以在这过程中我们舍掉的这些数对必然是一个端点和我们的初始端点相同,另一个端点成等差数列分布.也就是上述中的 9 , 6 , 3 , 0 9,6,3,0 9,6,3,0.并且我们需要知道的是,假设我们对初始的 ( A , B ) (A,B) (A,B)进行更相损减术操作,我们后面得到的数对都是一一对应的,也就是 ( A , B ) (A,B) (A,B)得到 ( a , b ) (a,b) (a,b)我们的 ( a , b ) (a,b) (a,b)就能通过题面中的操作重新变成 ( A , B ) (A,B) (A,B).所以此时考虑我们需要解决的问题,假设我们的 ( a i , b i ) (ai,bi) (ai,bi)能通过题面中的操作变成(A,B),我们的 ( a i , b i ) (ai,bi) (ai,bi)必然处于我们的 ( A , B ) (A,B) (A,B)变化链中.

那么我们可以考虑记录对 ( A , B ) (A,B) (A,B)的辗转相除法的过程,也就是记录每一次辗转相除法之后的数.如果我们将数看做节点,那么我们相对于更相损减术省略掉的那些点就在我们的两两节点相连的链上.更一般的,我们可以将整个过程看成一棵树.那么对于所有的(A,B)树来说,就是一颗森林.那么对于我们的 ( a i , b i ) (ai,bi) (ai,bi)来说,假设这个数对刚好是(A,B)树中的一个节点.那么显然的我们的 ( a i , b i ) (ai,bi) (ai,bi)可以变为 ( A , B ) (A,B) (A,B).如果不是节点的话,那么我们需要将 ( a i , b i ) (ai,bi) (ai,bi)进行一次辗转相除法操作,因为这样我们就可以将(ai,bi)转化成一个森林上的一个节点(原因是显然的,因为我们森林中的一个节点必然是一次辗转相除法之后的结果),那么对于此时新的 ( a , b ) (a,b) (a,b),我们就知道假设我们的 旧 ( a , b ) 旧(a,b) (a,b)能转化成 ( A , B ) (A,B) (A,B),意味着我们的 ( A , B ) (A,B) (A,B)在我们的 ( a , b ) (a,b) (a,b)这个节点的上面(此处的上面是指(A,B)能转化成新(a,b),并且(A,B)能转化成旧(a,b)).又因为对于在同一条链上的点来说,我们是很容易知道哪一个数固定,哪一个数成等差的(比一下大小即可).所以对于我们的合法的 ( A , B ) (A,B) (A,B) ( a , b ) (a,b) (a,b)来说,(A,B)中成等差的那一个数必然比 ( a , b ) (a,b) (a,b)中要大.(此处我们可以使用二分).

其实到这里我们的 t r i c k trick trick基本上就详细的讲完了.接下来讲讲具体做法(仅供参考)

乍一看对于每一节点似乎都是一个二叉树,但是仔细看发现一个简单的性质.假设我们的节点为 ( a , b ) (a,b) (a,b),我们此时 a < b a<b a<b的话,那么对于某个在它上面的 ( A , B ) (A,B) (A,B)来说,我们此时必然是有 A > B A>B A>B的,反之则( B > A B>A B>A).原因考虑辗转相除法的性质,此处不在赘述.同样的,我们发现不可能存在一个节点 ( a = b ) (a=b) (a=b).(这里的点是指辗转相除法过程中的节点,而不是之前所说的 ( a i , b i ) (ai,bi) (ai,bi))
考虑使用 v e c t o r vector vector来记录每一个节点的点对以及它的成等差的数的端点.就比如 ( 9 , 6 ) (9,6) (9,6),我们进行一次操作得到 ( 3 , 6 ) (3,6) (3,6),我们记录点对 ( 3 , 6 ) (3,6) (3,6),并且将 9 9 9存到 v e c t o r vector vector中,这意味着假设我们之后的 ( a i . b i ) (ai.bi) (ai.bi) ( 3 , 6 ) (3,6) (3,6)的话,我们的 9 9 9 6 6 6大,所以可以转化.那么对于一个点对来说,我们可能有很多个 ( A , B ) (A,B) (A,B)可以到达它,此时,我们需要存下每一个端点,然后在 ( a i , b i ) (ai,bi) (ai,bi)的时候直接用二分来查找有一个满足端点大于即可.

这里还有一个小细节需要注意,那就是当我们的 ( a i , b i ) (ai,bi) (ai,bi) a i = b i ai=bi ai=bi时,我们此时转化方法并不是单向的,而是双向的.也就是一个点处于两条链中.所以此时我们需要同时加上 ( a i , 0 ) , ( 0 , b i ) (ai,0),(0,bi) (ai,0),(0,bi)的结果.除此之外,根据辗转相除法的性质,其他点必不能同时处于两条链上.(因为既要 a > = b , b > = a a>=b,b>=a a>=b,b>=a那么只能相等)


下面是具体的代码部分(前文已足够详尽,代码不再补充注释):

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
#define int long long
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
map<pair<int,int>,vector<int>>tree;
void build(int a,int b) {if(a==0||b==0) return ;if(a<=b) {tree[make_pair(a,b%a)].push_back(b);build(a,b%a);}else {tree[make_pair(a%b,b)].push_back(a);build(a%b,b);}
}
signed main() {int T=read();while(T--) {tree.clear();int n=read();int q=read();for(int i=1;i<=n;i++) {int A=read();int B=read();build(A,B);}for(auto &it:tree) {sort(it.second.begin(),it.second.end());}for(int i=1;i<=q;i++) {int a=read();int b=read();if(a==b) {cout<<tree[make_pair(a,0)].size()+tree[make_pair(0,b)].size()<<endl;}else if(a<b) {pair<int,int>last_node=make_pair(a,b%a);auto pos=lower_bound(tree[last_node].begin(),tree[last_node].end(),b);cout<<tree[last_node].end()-pos<<endl;}else {pair<int,int>last_node=make_pair(a%b,b);auto pos=lower_bound(tree[last_node].begin(),tree[last_node].end(),a);cout<<tree[last_node].end()-pos<<endl;}}}return 0;
}

相关文章:

2023杭电多校第三场 1012.Noblesse Code

传送门:Vjudge 前题提要:一道挺有意思的数论题.赛时对于这道题没什么想法,但是赛后细品之后其实感觉也就那么一回事.但是这种 更相损减术与辗转相除法 相转化的题目还是有点典的,需要好好消化一下. 首先看完题目.我们需要考虑的是 ( A , B ) (A,B) (A,B)与 ( a , b ) (a,b) (…...

ubuntu qt 环境变量配置

ubuntu设置qt环境变量 qt 安装路径为&#xff1a;/home/ljn/Qt5.12 包含bin等目录的路经&#xff1a;/home/ljn/Qt5.14.2/5.14.2/gcc_64 环境变量配置 打开配置文件&#xff1a; sudo gedit /etc/profile在底部添加&#xff1a; export PATH"/home/ljn/Qt5.14.2/Tool…...

按照Vue写WPF(0):功能实现

文章目录 前言VUE具有的功能如何专业到WPF上面 前言 我最近学了WPF之后我终于知道为什么WPF学习曲线那么陡峭了。因为WPF没有组件化的思想&#xff0c;或者说没有按照Vue一样去模板化开发。 为什么我推荐Vue的想法呢。因为Vue最大的特点就是模板化&#xff0c;让Vue工程师去写…...

vb+ACCESS教师管理系统设计设计与实现

--------------前言-------------- 教师管理系统是一个企事业单位不可缺少的部分,它的内容对于企事业单位的决策者和管理者来说都至关重要,所以教师管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件信息,这种管理方式存在…...

C++笔记之对指针类型的变量进行+1操作

C笔记之对指针类型的变量进行1操作 在C中&#xff0c;对指针类型的变量进行"1"操作会根据指针的数据类型而有所不同。这涉及到指针的算术运算&#xff0c;C中的指针算术运算是根据指针所指向的数据类型的大小来进行的。 code review! 文章目录 C笔记之对指针类型的…...

第六章 游标

游标 本文内容较短&#xff0c;我们只是为了更容易的实现b树&#xff0c;简单地重构一下。 我们将添加一个Cursor 表示表中对象的位置。Cursor应提供如下几个方面的能力&#xff1a; 在表的开头创建游标在表的末尾创建游标访问游标指向的行将游标前进到下一行 这是本文我们…...

Github上方导航栏介绍

Code Watch&#xff1a;相当于关注&#xff0c;到时候这个项目又有什么操作&#xff0c;就会以通知的形式提醒你。 Fork&#xff1a;也就是把这个项目拉到你的仓库里&#xff0c;之后你可以对该代码进行修改&#xff0c;之后你可以发起Pull Request&#xff0c;简称PR&#xf…...

【vue3+ts】TypeError: Cannot read properties of undefined (reading ‘commit‘)

项目场景&#xff1a; <script lang"ts"> import { defineComponent, reactive, ref } from vue import { useStore } from vuex export default defineComponent({name: Login.vue,components: {},setup () {const onFormSubmit (result: boolean) > {if…...

seq2seq、attention、self-attention、transformer、bert

seq2seq seq2seq&#xff1a;输入序列&#xff0c;输出序列&#xff0c;将输入的语言转为一个向量&#xff0c;最后输出再将向量转为语言shortcoming:The final state is incapable of remembering a long sequence.即太长了记不住 attention 用attention可以改进seq2seq中的…...

07.计算机网络——数据链路层

文章目录 数据链路层以太网帧格式MAC地址理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响 ARP协议**ARP**协议的作用ARP协议的工作流程ARP数据报的格式 数据链路层 ​ 数据链路层在物理层提供的服务的基础上向网络层提供服务&#xff0c;…...

海外服务器推荐:国外高性能服务器免费

对于寻找高性能的海外服务器&#xff0c;海外服务器推荐指导&#xff0c;我建议您考虑以下因素&#xff1a; 1. 可靠性和性能&#xff1a;选择信誉良好、可靠性好的服务器提供商。它们应该有稳定的网络基础设施和高性能的服务器硬件来满足您的需求。 2. 位置选择&#xff1a;…...

Python基于PyTorch实现卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 卷积神经网络&#xff0c;简称为卷积网络&#xff0c;与普通神经网络的区别是它的卷积层内的神经元只覆…...

JMeter 配置环境变量步骤

通过给 JMeter 配置环境变量&#xff0c;可以快捷的打开 JMeter&#xff1a; 打开终端。执行 jmeter。 配置环境变量的方法如下。 Mac 和 Linux 系统 1、在 ~/.bashrc 中加如下内容&#xff1a; export JMETER_HOMEJMeter所在目录 export PATH$JAVA_HOME/bin:$PATH:.:$JME…...

Rust vs Go:常用语法对比(六)

题图来自[1] 101. Load from HTTP GET request into a string Make an HTTP request with method GET to URL u, then store the body of the response in string s. 发起http请求 package mainimport ( "fmt" "io/ioutil" "net" "net/http…...

css元素定位:通过元素的标签或者元素的id、class属性定位

前言 大部分人在使用selenium定位元素时&#xff0c;用的是xpath元素定位方式&#xff0c;因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观&#xff0c;更好理解一些。 css元素定位方式往往被忽略掉了&#xff0c;其实css元素定位方式也有它的价值&…...

java享元模式

在Java中实现享元模式&#xff0c;可以通过创建一个享元工厂&#xff08;FlyweightFactory&#xff09;和享元对象&#xff08;Flyweight&#xff09;来完成。享元模式用于共享可复用对象&#xff0c;以节省内存和提高性能。 下面是一个简单的示例&#xff1a; 首先&#xff…...

ESP32(MicroPython) 两轮差速五自由度机械臂小车

这次的项目在软件上没多少调整&#xff0c;但本人希望分享一下硬件上的经验。 小车使用两轮差速底盘&#xff0c;驱动轮在小车中间&#xff0c;前后都要万向轮。这种形式可以实现0转弯半径&#xff0c;但受万向轮及用于加高的铜柱的规格限制&#xff0c;两个万向轮难以调到相同…...

mysql基本函数(五)

目录 一、数字函数二、字符函数三、日期时间函数3.1 获取系统日期时间的函数3.2 日期格式化函数3.3 日期偏移计算3.4 日期之间相隔的天数 四、条件函数4.1 IF语句4.2 条件语句 一、数字函数 函数功能用例ABS绝对值ABS(-100)ROUND四舍五入ROUND(4.62)FLOOR向下取值FLOOR(9.9)CE…...

liteflow 2.10 配置中心简单记录

除nacos是一个key 同时管理chain和script node外,可以理解为配置文件整体放到一个key下nacos下的文件必须是xml格式,系统只实现了xml parser其它etcd,zk,Apollo 是两个namespace/path(chain及script node各一)下多个key,每个key对应一个chain/node所有配置中心的核心代码…...

【C++】引用、内联函数等

文章目录 一、引用1.引用概念2.引用特性3.引用时的权限问题4 .使用场景5 .引用和指针的联系与区别 二、内联函数1.概念2.注意点 三、auto关键字1.概念2.auto的使用细则 四、 基于范围的for循环1.概念2.范围for的使用条件 五、 指针空值nullptr1.概念2.使用注意 一、引用 1.引用…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...