任意模数 n 次剩余
\(n\) 次剩余
你需要解方程 \(x^n\equiv k\pmod m\),其中 \(x\in [0,m-1]\)。
保证解数不超过 \(C=10^6\)
\(1\le n,m,k\le 10^9\)
\(k<m\)
Sol
(1)\(m\) 是奇质数
此时 \(m\) 有原根,两边取对数得 \(ny\equiv b \pmod {m-1}\),使用 \(\text{exgcd}\) 可以求出 \(y\) 在 \([0,m-1]\) 的解。
(2)\(m=p^e\) , \(p\) 是奇质数。
令 \(k\%m \rightarrow k\) 然后分三种情况讨论如下
1、\(k=0\)
显然当且仅当 \(p^{\lceil \frac e n \rceil}\) 时等式能成立,故直接枚举 \(p^{\lceil \frac e n \rceil}\) 的倍数即可。
2、\((k,p^e)=1\)
取对数得 \(ny\equiv b \pmod{\varphi(p^e)}\)
这样的方程有解必须有 \(\gcd(n,\varphi(p^e)) \mid b\)
然后依然可以使用 \(\text{exgcd}\) 求解,然后再用指标算出 \(x=g^y\)。
3、\((k,p^e)> 1\)
我们设 \(k=c\times p^j ((c,p)=1)\)
这样的方程有解必须有 \(n \mid j\)
然后我们除去 \(p^j\) :\(\displaystyle \left(\frac{x}{p^{\frac{j}{n}}}\right)^n\equiv c\pmod{p^{e-j}}\)
换元 \(u=\frac{x}{p^{\frac{j}{n}}}\),\(u^n\equiv c \pmod{p^{e-j}}\),此时和第 2 种情况一模一样,我们套用之前方法求解。
此处有重大坑点,先跳过。
(3)\(m=2^d\)
因为要输出所有解,解的个数不多,可以倍增,那么它在模 \(2^{k-1}\) 情况下的所有解 \(x\),如果还要在 \(2^k\) 成立,必定是 \(x\) 或 \(x+2^{k-1}\)。
我们对于每一个 \(x\) 检查一下就好了,然后可以 bfs 出所有解。
最终求解
综上,我们对于一个任意正整数 \(m\),只要对其的唯一分解形式 \(m=p_1^{q_1}p_2^{q_2}\dots\) 的每个质数进行求解即可,
最后跑一遍 DFS 枚举模每个 \(p^q\) 意义下的值,用 CRT(中国剩余定理)合并即可。
许多坑点
1、对 \(p^k\) 求原根,check 的时候要用 \(\varphi(p^k)\) 而不是直接 \(p^k-1\)
2、在原式中 \(x\) 的取值范围是 \([0,p^e)\),那么 \(y=\frac{x}{p^{\frac{j}{n}}}\) 的取值范围就是 \([0,p^{e-\frac{j}{n}})\);
可是在后一个式子中 \(y\) 的取值范围变成了 \([0,p^{e−j})\)!!
因此我们最后的解的个数需要扩大 \(p^{j−j/n}\) 倍,我们枚举 \([0,p^{e−j})\) 中的解向后不断扩展即可。
3、你需要一个正确的 BSGS 板子
4、正确的写法对于任何一个解的 vector 都不需要 unique 的,如果求出大量重复的解可能会被卡掉。
任意模数 n 次剩余的更多相关文章
- 【51nod】1123 X^A Mod B (任意模数的K次剩余)
题解 K次剩余终极版!orz 写一下,WA一年,bug不花一分钱 在很久以前,我还认为,数论是一个重在思维,代码很短的东西 后来...我学了BSGS,学了EXBSGS,学了模质数的K次剩余--代码一个 ...
- 【知识总结】多项式全家桶(三)(任意模数NTT)
经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 上一篇:[知识总结]多项式全家桶(二)(ln和exp) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面 ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]
1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...
- 【集训队作业2018】取名字太难了 任意模数FFT
题目大意 求多项式 \(\prod_{i=1}^n(x+i)\) 的系数在模 \(p\) 意义下的分布,对 \(998244353\) 取模. \(p\) 为质数. \(n\leq {10}^{18} ...
- 任意模数NTT
任意模数\(NTT\) 众所周知,为了满足单位根的性质,\(NTT\)需要质数模数,而且需要能写成\(a2^{k} + r\)且\(2^k \ge n\) 比较常用的有\(998244353,1004 ...
- BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...
- [洛谷P4245]【模板】任意模数NTT
题目大意:给你两个多项式$f(x)$和$g(x)$以及一个模数$p(p\leqslant10^9)$,求$f*g\pmod p$ 题解:任意模数$NTT$,最大的数为$p^2\times\max\{n ...
- 拆系数FFT(任意模数FFT)
拆系数FFT 对于任意模数 \(mod\) 设\(m=\sqrt {mod}\) 把多项式\(A(x)\)和\(B(x)\)的系数都拆成\(a\times m+b\)的形式,时\(a, b\)都小于\ ...
随机推荐
- Vue中v-show和v-if的使用以及区别
个人博客 地址:http://www.wenhaofan.com/article/20190321143330 v-if 1.v-if 根据条件渲染,它会确保在切换过程中条件块内的组件销毁和重建 ...
- Oracle 中的 Incarnation 到底是个什么?概念理解篇
高中时候,我深深“爱”上了一位女孩子.那个年纪确实不懂什么是真正的“爱”,反正每天满脑子都是她,只要见到她就会紧张和激动,确切的说是深深的喜欢.你告诉我这叫初恋?不,我的初恋应该是小学3年级,三六班. ...
- SpringBoot学习- 3、整合MyBatis
SpringBoot学习足迹 1.下载安装一个Mysql数据库及管理工具,同类工具很多,随便找一个都可以,我在windows下做测试项目习惯使用的是haosql 它内部集成了MySql-Front管理 ...
- 控制台测试ajax
有的时候需要测试下web项目中post.get请求是否正确,但是这个时候电脑上没有安装测试工具,怎么办呢?直接用浏览器控制台测试,打开网站,F12控制台,在控制台下复制粘贴下面的ajax请求,之后aj ...
- vue学习指南:第十三篇(详细) - Vue的 路由 第三篇 ( 路由的缓存 )
路由的缓存 路由缓存是 Vue组件优化的一个重要方法 为什么实现路由缓存? 为了 组件间 相互切换不会重复加载数据,影响用户体验,我们通常需要将组件的数组实现缓存,当我们点过来,在点的时候会再次发送 ...
- Ehcache缓存框架与 Shiro 框架 出现出现验证错误 && Tomcat 缓存清除的问题
当一个项目使用久了以后就会出现各种问题,下面是我遇到的一个权限验证错误的问题 我的项目是 Ehcache 结合 Shiro 一起使用的,项目用用久了出现 Token验证错误,Cookie之类 ...
- jdk8-》stream⾥的map和filter函数使⽤
map函数 将流中的每⼀个元素 T(入参) 映射为 R(返回值)(类似类型转换) 类似遍历集合,对集合的每个对象做处理.场景:转换对象,如javaweb开发中集合⾥⾯的DO对象转换为DTO对象 ...
- jupyter快捷键使用
1. 服务启动与停止 环境为windows10系统 ctrl+R输入cmd,输入命令jupyter notebook启动 使用Control-c停止服务 2.常用快捷键 模式切换 当前cell侧边为蓝 ...
- 7.Springboot之web开发
自用 要解决的问题: 1.导入静态资源(html之类的(webapp)) 2.首页 3.没有写Jsp的地方-------->所以要学模板引擎Thymeleaf 4.装配扩展springmvc 5 ...
- 在多租户(容器)数据库中如何创建PDB:方法4 克隆远程Non-CDB
基于版本:19c (12.2.0.3) AskScuti 创建方法:克隆远程Non-CDB(从 Non-CDB 中进行远程克隆).将 非CDB数据库PROD1 远程克隆为 CDB1 中的 PDB7 对 ...