CRT exCRT模板
CRT从各种方面上都吊打exCRT啊......
短,好理解...
考虑构造bi使得bi % pi = ai,bi % pj = 0。然后全加起来就行了。
显然bi的构造就是ai * (P/pi) * inv(P/pi)。
LL a = 0, p = MO - 1; for(int i = 1; i <= 4; i++) {a = (a + ans[i] * (p / mod[i]) % p * qpow(p / mod[i], mod[i] - 2, mod[i]) % p) % p; }
exCRT:
是这样的,重新手推了一个短一点的模板。题是洛谷P3868 猜数字
1 inline int exCRT(int n, int *a, int *b) { 2 int t = a[1], p = b[1], x, y; 3 for(int i = 2; i <= n; i++) { 4 int g = exgcd(p, b[i], x, y); 5 p = lcm(p, b[i]); 6 t = (t - a[i]) % p; 7 y = y * (t / g) % p; 8 t = (a[i] + y * b[i]) % p; 9 } 10 return t; 11 }
具体操作的时候开long long,龟速乘,记得全程避免负数。
先背为敬。
1 #include <cstdio> 2 #include <algorithm> 3 4 typedef long long LL; 5 const int N = 100010; 6 7 LL p[N], a[N]; 8 9 inline LL mod(LL a, LL c) { 10 if(c < 0) { 11 c = (~c) + 1; 12 } 13 while(a >= c) { 14 a -= c; 15 } 16 while(a < 0) { 17 a += c; 18 } 19 return a; 20 } 21 inline LL mul(LL a, LL b, LL c) { 22 LL ans = 0; 23 while(b) { 24 if(b & 1) { 25 ans = mod(ans + a, c); 26 } 27 a = mod(a << 1, c); 28 b = b >> 1; 29 } 30 return ans; 31 } 32 LL exgcd(LL a, LL b, LL &x, LL &y) { 33 if(!b) { 34 x = 1; 35 y = 0; 36 return a; 37 } 38 LL g = exgcd(b, a % b, x, y); 39 std::swap(x, y); 40 y -= (a / b) * x; 41 return g; 42 } 43 44 int main() { 45 int n; 46 scanf("%d", &n); 47 for(int i = 1; i <= n; i++) { 48 scanf("%lld%lld", &p[i], &a[i]); 49 } 50 51 LL A = a[1], P = p[1]; 52 for(int i = 2; i <= n; i++) { 53 LL x, y; 54 LL C = (a[i] - A), g = exgcd(P, p[i], x, y); 55 C = (C % p[i] + p[i]) % p[i]; 56 if(C % g) { 57 puts("-1"); 58 return 0; 59 } 60 61 x = mul(x, C / g, P / g * p[i]); 62 A += mul(x, P, P / g * p[i]); 63 P *= p[i] / g; 64 A = mod(A, P); 65 } 66 67 // x === A mod P 68 LL x, y; 69 exgcd(P, 1, y, x); 70 x *= A; 71 x = (x % P + P) % P; 72 printf("%lld\n", x); 73 return 0; 74 }
AC代码
尝试合并两个同余方程:
判断有解后可用exgcd解方程。
至此合并完成。
所有方程逐一合并即可。
转载于:https://www.cnblogs.com/huyufeifei/p/10039410.html
CRT exCRT模板相关推荐
- 2021寒假笔记(数论)
一.素数判定 Miller_Rabbin 引理: 费马小定理 a(p−1)=1(modp)a^(p-1)=1(mod\ p)a(p−1)=1(mod p) 二次探测定理 x2=1(modp)x^2=1 ...
- YBT 6 数学基础
$补+写题ing$ 第 1 章 快速幂 序列的第 k 个数 link $solution:$ 板子 A 的 B 次方 link $solution:$ 板子 [NOIP2013] 转圈游戏 link ...
- ICPC 2019 徐州网络赛
ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...
- 每周记录(4月底停更了qvq)
1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...
- 正睿19暑期B班DAY7 数论
洛谷今日份:宜打chunithm(您虹了),sdvx(您暴了) 今日又是课件非常丰富份,本文仅作批注 首先要理解群,环,域的概念(这个会再提一次) 几个代数结构 群 是一个集合加上一个运算 满足封闭性 ...
- yyb要填的各种总结的坑
已经写好啦的 如果有没有找到的东西,可以戳这里找找qwq 莫比乌斯反演&杜教筛 动态点分治 另外一个动态点分治 斜率优化 Splay 莫队 凸包 旋转卡壳 Manacher算法 Trie树 A ...
- 使用open***构建安全***
使用open***构建安全*** ***概述 ×××(Virtual PrivateNetwork)虚拟专用网络,是依靠ISP和其他的NSP在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者 ...
- nodejs linux模块全局,nodejs笔记一--模块,全局process对象;
一.os模块可提供操作系统的一些基本信息,它的一些常用方法如下: var os = require("os"); var result = os.platform(); //查看操 ...
- [专题总结]组合数学
好恶心的一个专题! 首先大致总结一下求组合数的方法: 暴力(复杂度为min(m,n-m))同时乘大数以及小数的逆元,其余部分分子分母相消. lucas:适用于模数小的时候,复杂度logpn 杨辉三角: ...
最新文章
- windows10下安装Linux7,win10Hyper-V下安装CentOS7
- 高通平台 /sys/module/lpm_levels/parameters/sleep_disabled节点
- 分享一张前端知识点思维导图
- 【Verilog HDL学习之路】第一章 Verilog HDL 数字设计总论
- IOS沙盒中的Documents、Library、tmp区别
- exchange2003客户端无法收发邮件的一次处理过程
- AIX 系统下做 rootvg
- 02 - 用wxStreamToTextRedirector和wxTextCtrl输出std::cout
- 项目管理学习——PMP 5A高分通过备考经验分享
- input type=file 选取文件路径时出现fakepath问题IE浏览器解决办法
- 域名解析后主机记录和记录值怎么填写?
- 利用python进行A/B测试
- Suspending console(s) (use no_console_suspend to debug) android4.0 OMAP4460
- 【《Real-Time Rendering 3rd》 提炼总结】(五) 第六章 · 纹理贴图及相关技术 The Texturing
- 英特尔芯片组系列 服务器,英特尔主板现在有几种架构,分别都是什么。都是对应什么系列CPU安装最好。说的越详细越好...
- LaTeX中的拼写及语法检查
- 女生到底还做java还是前端_女孩子想转行的话学前端好还是java,哪个更有发展?...
- Vue天地图之图层类型切换
- 远程视频监控:流媒体之FFmpeg+RTMP+Nginx+VLC
- TASK9 Boosting