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,b−a)).但是使用辗转相除法处理我们的 ( 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 安装路径为:/home/ljn/Qt5.12 包含bin等目录的路经:/home/ljn/Qt5.14.2/5.14.2/gcc_64 环境变量配置 打开配置文件: sudo gedit /etc/profile在底部添加: export PATH"/home/ljn/Qt5.14.2/Tool…...
按照Vue写WPF(0):功能实现
文章目录 前言VUE具有的功能如何专业到WPF上面 前言 我最近学了WPF之后我终于知道为什么WPF学习曲线那么陡峭了。因为WPF没有组件化的思想,或者说没有按照Vue一样去模板化开发。 为什么我推荐Vue的想法呢。因为Vue最大的特点就是模板化,让Vue工程师去写…...
vb+ACCESS教师管理系统设计设计与实现
--------------前言-------------- 教师管理系统是一个企事业单位不可缺少的部分,它的内容对于企事业单位的决策者和管理者来说都至关重要,所以教师管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件信息,这种管理方式存在…...
C++笔记之对指针类型的变量进行+1操作
C笔记之对指针类型的变量进行1操作 在C中,对指针类型的变量进行"1"操作会根据指针的数据类型而有所不同。这涉及到指针的算术运算,C中的指针算术运算是根据指针所指向的数据类型的大小来进行的。 code review! 文章目录 C笔记之对指针类型的…...
第六章 游标
游标 本文内容较短,我们只是为了更容易的实现b树,简单地重构一下。 我们将添加一个Cursor 表示表中对象的位置。Cursor应提供如下几个方面的能力: 在表的开头创建游标在表的末尾创建游标访问游标指向的行将游标前进到下一行 这是本文我们…...
Github上方导航栏介绍
Code Watch:相当于关注,到时候这个项目又有什么操作,就会以通知的形式提醒你。 Fork:也就是把这个项目拉到你的仓库里,之后你可以对该代码进行修改,之后你可以发起Pull Request,简称PR…...
【vue3+ts】TypeError: Cannot read properties of undefined (reading ‘commit‘)
项目场景: <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:输入序列,输出序列,将输入的语言转为一个向量,最后输出再将向量转为语言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数据报的格式 数据链路层 数据链路层在物理层提供的服务的基础上向网络层提供服务,…...
海外服务器推荐:国外高性能服务器免费
对于寻找高性能的海外服务器,海外服务器推荐指导,我建议您考虑以下因素: 1. 可靠性和性能:选择信誉良好、可靠性好的服务器提供商。它们应该有稳定的网络基础设施和高性能的服务器硬件来满足您的需求。 2. 位置选择:…...
Python基于PyTorch实现卷积神经网络分类模型(CNN分类算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 卷积神经网络,简称为卷积网络,与普通神经网络的区别是它的卷积层内的神经元只覆…...
JMeter 配置环境变量步骤
通过给 JMeter 配置环境变量,可以快捷的打开 JMeter: 打开终端。执行 jmeter。 配置环境变量的方法如下。 Mac 和 Linux 系统 1、在 ~/.bashrc 中加如下内容: 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定位元素时,用的是xpath元素定位方式,因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观,更好理解一些。 css元素定位方式往往被忽略掉了,其实css元素定位方式也有它的价值&…...
java享元模式
在Java中实现享元模式,可以通过创建一个享元工厂(FlyweightFactory)和享元对象(Flyweight)来完成。享元模式用于共享可复用对象,以节省内存和提高性能。 下面是一个简单的示例: 首先ÿ…...
ESP32(MicroPython) 两轮差速五自由度机械臂小车
这次的项目在软件上没多少调整,但本人希望分享一下硬件上的经验。 小车使用两轮差速底盘,驱动轮在小车中间,前后都要万向轮。这种形式可以实现0转弯半径,但受万向轮及用于加高的铜柱的规格限制,两个万向轮难以调到相同…...
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.引用…...
【Dify】无网络环境下的Dify部署指南:从在线到离线的无缝迁移
1. 为什么需要离线部署Dify? 在企业级应用场景中,数据安全和网络隔离是刚需。很多金融、政务、医疗机构的服务器都部署在内网环境,完全与互联网物理隔离。这时候如果想使用Dify这样的AI应用开发平台,常规的在线安装方式就完全行不…...
Pandas数据预览优化:告别Pycharm输出窗口的省略号困扰
1. 数据预览的痛点:被省略号吃掉的关键信息 刚接触Pandas那会儿,我总被Pycharm的输出窗口气得跳脚。明明调用了describe()想看数据分布,结果给我整出一堆省略号,关键统计量全藏在"..."里。最崩溃的是处理宽表时…...
League Akari终极指南:提升你的英雄联盟游戏体验
League Akari终极指南:提升你的英雄联盟游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于LCU API开…...
LC327树状数组与归并排序
327. 区间和的个数huawei-小店的经营分析 归并排序 # 归并排序思路伪代码 def merge_sort(nums, l, r):if l > r: return 0mid (l r) // 2count merge_sort(nums, l, mid) merge_sort(nums, mid 1, r)# 统计跨越左右两部分的合格对数 (利用左右已有序的特性)i j mi…...
Tsuru平台配置管理终极指南:集中式与分布式策略详解
Tsuru平台配置管理终极指南:集中式与分布式策略详解 【免费下载链接】tsuru Open source and extensible Platform as a Service (PaaS). 项目地址: https://gitcode.com/gh_mirrors/ts/tsuru Tsuru作为一款开源且可扩展的Platform as a Service (PaaS)平台&…...
2026年4月OpenClaw怎么部署?腾讯云零门槛流程:含安装及大模型API、Skill配置
2026年4月OpenClaw怎么部署?腾讯云零门槛流程:含安装及大模型API、Skill配置。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉…...
Spyglass实战指南:从约束到违例豁免的CDC/RDC检查全流程
1. Spyglass入门:CDC/RDC检查基础 第一次接触Spyglass时,我被它复杂的规则体系搞得晕头转向。直到在项目中真正用它解决了几个棘手的跨时钟域问题,才明白这个工具的价值。简单来说,Spyglass就像个经验丰富的"电路医生"&…...
LN2406 PWM/PFM 控制 DC-DC 降压稳压器
■ 产品概述 LN2406 是一款由基准电压源、振荡电路、比较器、PWM/PFM 控制电路等构成的 CMOS 降压 DC/DC 调整器。利用 PWM/PFM 自动切换控制电路达到可调占空比,具有全输入电压范围(2.0-6V)内的低纹波、高效率和大输出电流等特点…...
工业数据 vs. 传统资源:为什么数据才是未来的稀缺资产
从成本投入到战略资产——工业数据能成为"新石油"吗? “Data is the new oil”,数据是新石油这个比喻,最早由英国数学家 Clive Humby 在 2006 年提出。但真正让这一概念深入人心的,是《经济学人》2017 年的封面文章&am…...
新手避坑指南:用Matlab给六轴机器人做路径规划,选笛卡尔空间还是关节空间?
六轴机器人路径规划实战:从零开始掌握笛卡尔与关节空间选择策略 1. 初识机器人路径规划的核心挑战 第一次接触六轴机器人路径规划时,我被各种专业术语和数学公式淹没。直到亲手在Matlab中实现第一个机械臂运动程序,才真正理解路径规划的本质—…...
