首页 > 其他分享 >在线 $\Theta(1)$ 逆元

在线 $\Theta(1)$ 逆元

时间:2023-05-17 22:48:03浏览次数:44  
标签:frac 在线 int inv lep leq 逆元 Theta mod

// created on 23.04.30

目录

在线 O(1) 逆元

给定 质数 模数 \(p\),多次查询一个数 \(a\) 的逆元,强制在线。

我们有一个 \(O(p^{\frac{2}{3}})\) 的预处理,\(O(1)\) 查询的做法。

Farey 序列即 \(F_n\) 表示所有分母不超过 \(n\) 的最简真分数构成的有序数列(左右端点为 \(\frac{0}{1}\)、\(\frac{1}{1}\))。求 Farey 序列是简单,每次只要用 \(\frac{a}{b},\frac{c}{d}\) 生成 \(\frac{a+c}{b+d}\) 并放在中间即可。Farey 序列有一个性质是 \(cb-ad=1\),这个容易证明。

定理:对于任意整数 \(n\geq 2\) 和任意实数 \(v\in[0,1]\),总能在 \(F_{n-1}\) 找到 \(\frac{x}{y}\) 满足 \(|v-\frac{x}{y}|\leq \frac{1}{yn}\) 。更强地,这个 \(\frac{x}{y}\) 一定是 \(v\) 向前 / 向后的第一个分数。

于是,令 \(n\) 为定值。对于 \(a\) 令 \(v=\frac{a}{p}\) 并找到 \(\frac{x}{y}\) 满足 \(|\frac{a}{p}-\frac{x}{y}|\leq \frac{1}{yn}\) 。即 \(|ay-px|\leq \lfloor\frac{p}{n}\rfloor\) 。意思是 \(ay\equiv u\pmod{p}\),而 \(|u|\leq \lfloor\frac{p}{n}\rfloor\) 。注意到 \(a^{-1}\equiv u^{-1}y\pmod{p}\),因此只要处理 \(O(\lfloor\frac{p}{n}\rfloor)\) 个数的逆元。

注意 \(F_{n-1}\) 中,\(\lfloor\frac{xn^2}{y}\rfloor\) 各不相同。因此开一个长度为 \(n^2\) 的 01 序列,记录某个 \(\lfloor\frac{xn^2}{y}\rfloor\) 是否存在。枚举 \(x,y\),记录每个位置的分数即可。而找 \(\frac{x}{y}\),则相当于查前后的第一个 \(1\),只要算前缀即可。

最后取 \(n=p^{\frac{1}{3}}\) 即可。

namespace o1_inv {
	const int n = 1e3, n2 = 1e6, lim = mod / n;

	const int N = n2 + 5;

	int sum[N], _inv[N], siz;
	pair <int, int> frac[N], farey[N];

	inline void init () {
		lep (q, 1, n - 1) lep (p, 0, q) {
			int i = p * n2 / q;
			if (! sum[i]) sum[i] = 1, frac[i] = { p, q };
		}

		lep (i, 1, n2) sum[i] += sum[i - 1];
		lep (i, 0, n2) if (frac[i].se) farey[siz ++ ] = frac[i];

		_inv[1] = 1;
		lep (i, 2, lim) _inv[i] = mul (mod - mod / i, _inv[mod % i]);
	}
	inline int inv (int a) {
		int i = 1ll * a * n2 / mod, k = sum[i], p, q; ll t;
		if (k < siz) {
			tie (p, q) = farey[k], t = 1ll * a * q - 1ll * mod * p;
			if (abs (t) <= lim) return mul (q, (t > 0 ? _inv[t] : mod - _inv[ - t]));
		}
		if ( -- k >= 0) {
			tie (p, q) = farey[k], t = 1ll * a * q - 1ll * mod * p;
			if (abs (t) <= lim) return mul (q, (t > 0 ? _inv[t] : mod - _inv[ - t]));
		}
		return -1;
	}
}

再记一个做法:一次询问时,我们希望找到 \(u\) 使得 \(xu\bmod p\) 较小,这样只要回答 \(\frac{1}{xu}\) 。

考虑令 \(x=at+b\),而 \(t=p^{\frac{1}{3}},u\leq p^{\frac{1}{3}}\),则 \(bu\) 只有 \(p^{\frac{2}{3}}\) 。

只要达成 \(-p^{\frac{2}{3}}\leq|atu|\leq p^{\frac{2}{3}}\) 就可以了。即找到 \(\frac{v}{u}\equiv at\pmod {p}\) 且 \(|v|\leq p^{\frac{2}{3}}\) 。此时 \(\{uat-v\}\) 的个数已经超过了 \(p\),在这之中一定能找到 \(0\)(要不然存在俩相同的,相减就是 \(0\) 了)。

于是只要找到 \(u\) 就大功告成了。枚举 \(u\) 找所有 \(-p^{\frac{2}{3}}\leq|atu|\leq p^{\frac{2}{3}}\) 的 \(a\),因为 \(tu\geq p^{\frac{1}{3}}\),所以暴力找出 \(a\) 即可。

原文:在线 \(\Theta(1)\) 逆元 - zhoukangyang - 博客园 (cnblogs.com)

namespace o1_inv {
	const int n = 1 << 10, N = (1 << 21) | 1;

	int pool[N << 1], * iv = pool + N;
	int rec[N], pot[N];

	void init (int _p) { 
		int lim = mod >> 10, _lim = mod - lim;
		lep (u, 1, n) {
			int cur = 0, d = u << 10;
			for (int i = 0; i <= lim; ) {
				if (cur <= lim) rec[i] = u;
				else if (cur >= _lim) rec[i] = - u;
				else {
					int r = (_lim - cur - 1) / d;
					cur += r * d, i += r;
				}
				if (cur += d, i ++, cur >= mod) cur -= mod;
			}
		}
		lep (a, 0, lim) pot[a] = mul (a << 10, rec[a] + mod);
	
		iv[1] = 1;
		lep (i, 2, N - 1) iv[i] = mul (iv[mod % i], mod - mod / i);
		lep (i, 1, N - 1) iv[ - i] = mod - iv[i];
	}
	int inv (int x) {
		int a = x >> 10, b = x & 1023, u = rec[a];
		return mul (u + mod, iv[pot[a] + b * u]);
	}
}

标签:frac,在线,int,inv,lep,leq,逆元,Theta,mod
From: https://www.cnblogs.com/qiulyqwq/p/17410552.html

相关文章

  • 初等数论——素数,逆元,EXGCD有关
    初等数论素数定义设整数\(p\ne0,\pm1\)。如果\(p\)除了平凡约数以外没有其他约数,那么称\(p\)为素数(不可约数)。若整数\(a\ne0,\pm1\)且\(a\)不是素数,则称\(a\)为合数。——————OIWiki素数的判定(素性测试)如何判断一个数\(x\)是不是质数?很显然我们可......
  • PageOffice在线打开 word 文件,并且禁止复制
    在线打开word禁用拷贝的三种方式:1使用AllowCopy属性,效果:所有的word进程都不能进行拷贝操作2禁止word选择功能,效果:因为无法选择,所以无法拷贝3使用DisableCopyOnly属性,效果:禁止拷贝文档内容到外部,但内部是可以拷贝的,也可以从外部拷贝到word文档内部具体实现过......
  • 在线 $\Theta(1)$ 逆元
    最近看到这个题,想到了一种比较简单的做法。首先,我们考虑给\(x\)乘以一非零整数\(u\),如果我们能求出\(\frac{1}{xu}\),我们就可以通过再乘以\(u\)得到答案。考虑让\(u\)和\(xu\bmodp\)比较接近\(0\),预处理\(|k|\)比较小的所有\(\frac{1}{k}\)。考虑分块:设\(x=......
  • kettle 在线服务 carte 数据 资源库默认大写 数据库使用默认端口
    连接已存在资源库原来是表名小写直接设置mysql表名小写vim/etc/mysql/my.cnf#值为0表示不进行转换,值为2表示区分大小写,并且会将表名存储为区分大小写的形式lower_case_table_names=1遇到资源端口3307kettle确是3306只修改了r_databse表的host、port、use......
  • 爬虫爬取在线小说阅读网站详解
    前言环境:python安装、requests安装、BeautifulSoup安装爬取目标:笔趣看网站的《校花之贴身高手》,以下是第一章链接https://www.biqukan.com/11_11499/4260511.html开始爬取1.打开链接,打开检查窗口通过审查Elements,能定位到小说的文本内容在<divid="content"class="showtxt">......
  • 实现在线用户列表显示、注销的Listener
    实现在线用户列表显示、注销的Listener文章分类:Java编程实现一个对在线用户的监听:即监听用户的登录和注销两个操作。需要自定义一个Listener,实现ServletContextListener,HttpSessionListener和HttpSessionAttributeListener。一、表示层:1、用户登录表单Login.jspJsp......
  • 能粘贴Word 内容(含公式)的在线编辑器
    ​ 图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM.plugins['autoupload'],然后找到autoUploadHandler方法,注释掉其中的代码。加入下面的代码://判断剪......
  • 国内chatgpt国内版-gpt在线入口
    https://service-ht6dwx8s-1256721724.gz.apigw.tencentcs.com/release/永久性免费chatgpt网页版时间:2023.05.15起投入使用chatgpt120$key chatgpt4.0账号Midjourney会员帐号 ......
  • hdu:求和(逆元)
    ProblemDescriptionApex实验室里培养了很多种类的细菌。细菌的繁殖遵循如下规则:第k种细菌在第t个单位时间内新增的数量为k^t。例如,k=2,t=4时,第种细菌的总数为2+4+8+16。现在,实验室里一共有n种细菌,分别为1,2,3,…,n。在第1单位时间结束后,第k种细菌的个数为k个。求第m个单位时......
  • 【毕业设计】基于ssm的零售销售零食网站、零售在线商城管理系统,附源码+文档+PPT
    1、项目介绍该系统可供管理员和用户使用,管理员功能包括:登录、首页、系统设置、用户管理、业务管理、统计分析、个人信息、密码、退出等功能。用户功能包括:登录、注册、首页、资讯信息、商品列表、在线留言、购物车、个人中心、退出等功能。项目获取,看这里2、技术框架前端框架......