「科技」在线 O(1) 逆元
问题:固定模数 \(p\),多次回答某个数 \(a\) 的逆元。强制在线。
本文提供一个 \(O(p^{\frac{2}{3}})\) 预处理,\(O(1)\) 查询的做法。
首先定义一下 Farey 序列:记 \(F_{m}\) 表示所有分母不超过 \(m\) 的最简真分数构成的有序数列。例如 \(F_5 = \{\frac{0}{1}, \frac{1}{5}, \frac{1}{4}, \frac{1}{3}, \frac{2}{5}, \frac{1}{2}, \frac{3}{5}, \frac{2}{3}, \frac{3}{4}, \frac{4}{5}, \frac{1}{1}\}\)。可以认为 \(\frac{0}{1}, \frac{1}{1}\) 也是最简真分数。
Farey 序列有一个性质:对于 \(F_m\) 中任意相邻两个分数 \(\frac{x}{y}, \frac{z}{w}\),一定满足 \(yz - xw = 1\)。
事实上,\(F_m\) 可以由 \(F_{m - 1}\) 扩展得到。对于 \(F_{m - 1}\) 中任意相邻两个分数 \(\frac{x}{y}\) 和 \(\frac{z}{w}\),如果 \(y + w = m\),就在这两个分数中间插一个 \(\frac{x + z}{y + w}\),这样就得到了 \(F_m\)。验算一下就能发现上述性质可以归纳证明。
我们只要运用下面的定理,就能解决原问题:
定理:对于任意整数 \(n \ge 2\) 和任意实数 \(v \in [0, 1]\),总是能在 \(F_{n - 1}\) 中找到 \(\frac{x}{y}\),满足 \(|v - \frac{x}{y}| \le \frac{1}{yn}\)。更强地,这个 \(\frac{x}{y}\) 一定是 \(v\) 向前或向后找到的第一个分数。
考虑固定 \(n\),令 \(v = \frac{a}{p}\)。那么就有 \(|\frac{a}{p} - \frac{x}{y}| \le \frac{1}{yn}\)。
两边同乘 \(py\),得到 \(|ay - px| \le \lfloor \frac{p}{n} \rfloor\)。
这意味着 \(ay \equiv u \pmod p\),其中 \(|u| \le \lfloor \frac{p}{n} \rfloor\)。因为 \(a^{-1} = u^{-1}y\),所以只要预处理出所有不超过 \(\lfloor \frac{p}{n} \rfloor\) 的数的逆元即可。
这样还有两个问题:怎么不用排序生成 Farey 序列;怎么 \(O(1)\) 找到 \(\frac{x}{y}\)。
发现序列中所有 \(\lfloor \frac{xn^2}{y} \rfloor\) 互不相同。我们开一个长度为 \(n^2\) 的 01 序列,每一位表示是否存在 \(\lfloor \frac{xn^2}{y} \rfloor\) 等于该下标。这样就可以桶排序;并且查询等价于查一个位置前后的第一个 \(1\),这个只要算一下 01 序列的前缀和即可。
预处理的时间是 \(O(n^2 + \frac{p}{n})\)。令 \(n = p^{\frac{1}{3}}\),我们就得到了 \(O(p^{\frac{2}{3}})\) 预处理,\(O(1)\) 查询的算法。
「科技」在线 O(1) 逆元的更多相关文章
- 「 神器 」在线PDF文件管理工具和图片编辑神器
每天进步一丢丢,连接梦与想 在线PDF文件管理工具 完全免费的PDF文件在线管理工具,其功能包括:合并PDF文件.拆分PDF文件.压缩PDF文件.Office文件转换为PDF文件.PDF文件转换为JP ...
- 一个「学渣」从零开始的Web前端自学之路
从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低 ...
- 36氪首发 | 「myShape」完成千万级人民币 Pre-A轮融资,推出 AI 智能健身私教
无需任何可穿戴设备. 36氪获悉,myShape(原Shapejoy)已于近期完成千万级人民币的Pre-A轮融资,由天奇阿米巴领投,远洋集团.七熹资本以及老股东跟投.过去 myShape 曾获得元迅资 ...
- 《Offer一箩筐》一份高质量「简历」撰写指南,望打扰!!
「MoreThanJava」 宣扬的是 「学习,不止 CODE」. 如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! Hi~ 这里是 ...
- 「2014-2-26」Unicode vs. UTF-8 etc.
目测是个老问题了.随便一搜,网上各种总结过.这里不辞啰嗦,尽量简洁的备忘一下. 几个链接,有道云笔记链接,都是知乎上几个问题的摘录:阮一峰的日志,1-5 还是值得参考,但是之后的部分则混淆了 Wind ...
- 「luogu4462」[CQOI2018] 异或序列
「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...
- LOJ #2116 Luogu P3241「HNOI2015」开店
好久没写数据结构了 来补一发 果然写的时候思路极其混乱.... LOJ #2116 Luogu P3241 题意 $ Q$次询问,求树上点的颜色在$ [L,R]$中的所有点到询问点的距离 强制在线 询 ...
- 「FJOI2016」神秘数 解题报告
「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...
- 「NOI2014」购票 解题报告
「NOI2014」购票 写完了后发现写的做法是假的...然后居然过了,然后就懒得管正解了. 发现需要维护凸包,动态加点,询问区间,强制在线 可以二进制分组搞,然后你发现在树上需要资瓷撤回,然后暴力撤回 ...
随机推荐
- PHP中 die,die(),exit,exit(),return,return() 的区别
die:是遇到错误才停止die():停止程序运行,输出内容exit:是停止程序运行,是直接停止,并且不运行后续代码,不输出内容exit():可以显示内容.exit(0):正常运行程序并退出程序:exi ...
- 一站式超全JavaScript数组方法大全
一站式JavaScript数组方法大全(建议收藏) 方法一览表 详细操作 本人总结了JavaScript中有关数组的几乎所有方法(包含ES6之后新增的),并逐一用代码进行演示使用,希望可以帮助大家! ...
- 一招教你IDEA中Java程序如何打包,以及打包后如何运行
前言 编写程序 程序打包 测试运行 IDEA作为目前按最主流的Java程序项目编写工具,越来越受到开发人员的青睐.idea因为其五花八门的功能,让你在开发过程中效率显著提高.那么对于初学者来说,如何通 ...
- 流量录制与回放在vivo的落地实践
一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...
- Keras学习:第一个例子-训练MNIST数据集
import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...
- 微服务从代码到k8s部署应有尽有系列(五、民宿服务)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- JwtAccessTokenConverter问题整理
Cannot convert access token to JSON 授权服务颁发token(未进行公私钥加密)后,携带此token请求资源服务,提示此错误. 使用token可以在线解析,跟踪代码后 ...
- [Java]Java入门笔记(一):IDE设置、部分快捷键
一.Eclipse 软件设置 注意 同一时间,工作空间只能使用1个. 1.1 创建程序的步骤 创建项目Java Project 注意:项目名不要使用数字,也不要以数字开头: 选择"Use d ...
- k8s基础环境配置:基于CentOS7.9
k8s基础环境配置:基于CentOS7.9 wmware15安装centos7.9:https://www.cnblogs.com/uncleyong/p/15261742.html 1.配置静态ip ...
- k8s管理平台:rancher
简介 中文官网:https://docs.rancher.cn/ github:https://github.com/rancher/rancher 基础环境 https://www.cnblogs. ...