CRT和EXCRT学习笔记
蒟蒻maomao终于学会\(CRT\)啦!发一篇博客纪念一下(还有防止忘掉)
\(CRT\)要解决的是这样一个问题:
$$x≡a_1(mod m_1)$$
$$x≡a_2(mod m_2)$$
$$x≡a_3(mod m_3)$$
$$...$$
$$x≡a_k(mod m_k)$$
其中,\(m\)之间两两互质。这个问题有一个通解是\(\sum a_i * M * t_i / m_i\),其中\(t_i\)代表方程\(M * t_i / m_i ≡ 1\)的最小正整数解。
为什么它是对的呢?对于任意一个式子\(x≡a_j(mod m_j)\),通解中\(i = j\)的部分会贡献\(a_i\)的余数,而其它部分会贡献\(0\)的余数。
更一般的,我们来考虑如果\(m\)之间不互质的情况,由于打公式很累,所以详细请参考这个博客。
发一下\(exCRT\)的板子。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100010;
int n, bi[N], ai[N];
int add (int a, int b, int mod) {
return ((a + b) % mod + mod ) % mod;
}
int mul (int a, int b, int mod) {
int res = 0;
while (b > 0) {
if (b & 1) {
res = (res + a) % mod;
}
a = (a + a) % mod;
b >>= 1;
}
return res;
}
int exgcd (int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int gcd = exgcd (b, a % b, x, y);
int xx = y, yy = x - (a / b) * y;
x = xx, y = yy;
return gcd;
}
int excrt () {
int x, y;
int M = ai[1], ans = bi[1]; //通解是b[1] + a[1] * t ≡b[2] (mod a[2]);
for(int i = 2; i <= n; ++i) {
//M * x + a[i] * y = b[i] - ans;
//其中 ans + M * x % lcm (M, b[i]) 就是新的通解
//求出来的x是对于gcd (M, a[i])而言,所以要乘上c / gcd (M, a[i]);
int a = M, b = ai[i], c = add (bi[i], -ans, b);
int gcd = exgcd (a, b, x, y), bg = b / gcd;
x = mul (x, c / gcd, ai[i]);
ans += x * M;//更新前k个方程组的答案
M *= bg;//M为前k个m的lcm
ans = (ans %M + M) % M;
}
return ans;
}
signed main () {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> ai[i] >> bi[i]; //b是余数,a是模数。
}
cout << excrt () << endl;
return 0;
}
CRT和EXCRT学习笔记的更多相关文章
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- CRT&EXCRT学习笔记
非扩展 用于求解线性同余方程组 ,其中模数两两互质 . 先来看一看两个显然的定理: 1.若 x \(\equiv\) 0 (mod p) 且 y \(\equiv\) 0 (mod p) ,则有 x+ ...
- CRT & EXCRT 学习笔记
这玩意解决的是把同余方程组合并的问题. CRT的核心思想和拉格朗日插值差不多,就是构造一组\(R_i\)使得$\forall i,j(i \neq j) $ \[R_im_i = 1, R_im_j ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- Linux学习笔记(7)CRT实现windows与linux的文件上传下载
Linux学习笔记(7)CRT实现windows与linux的文件上传下载 按下Alt + p 进入SFTP模式,或者右击选项卡进入 命令介绍 help 显示该FTP提供所有的命令 lcd 改变本地上 ...
- 扩展中国剩余定理(EXCRT)学习笔记
扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- shell学习笔记
shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...
- https学习笔记三----OpenSSL生成root CA及签发证书
在https学习笔记二,已经弄清了数字证书的概念,组成和在https连接过程中,客户端是如何验证服务器端的证书的.这一章,主要介绍下如何使用openssl库来创建key file,以及生成root C ...
随机推荐
- for 循环增强
package cn.zhou.com; /* * 增强for循环 * * for(int i:arr) * { * System.out.print(i+1+" "); * } ...
- Spring Boot 构建电商基础秒杀项目 (七) 自动校验
SpringBoot构建电商基础秒杀项目 学习笔记 修改 UserModel 添加注解 public class UserModel { private Integer id; @NotBlank(m ...
- 在 Activity 中实现 getContentView 操作
2017/9/8 17:17:03 前言 最近接到个需要优化Android原生系统设置APK的任务.这个任务里面有一个更换应用背景图片的需求.我手里的这个设备是一个平板设备,使用了一下这个 ...
- BZOJ4482[Jsoi2015]套娃——贪心+set
题目描述 [故事背景] 刚从俄罗斯旅游回来的JYY买了很多很多好看的套娃作为纪念品!比如右 图就是一套他最喜欢的套娃J.JYY由于太过激动,把所有的套娃全 部都打开了.而由于很多套娃长得过于相像,JY ...
- 云服务器ECS
云服务器Elastic Compute Service(ECS)是阿里云提供的一种基础云计算服务.使用云服务器ECS就像使用水.电.煤气等资源一样便捷.高效.您无需提前采购硬件设备,而是根据业务需要, ...
- Java json转model
前面有一篇关于 json的转换类的工具:http://blog.csdn.net/hanjun0612/article/details/77891569 但是有一个情况. 由于java需要属性小写开 ...
- python中的map函数
def f(x): return x * x """将一个全是数字的list变成平方形式""" def f2(): ls = [1, 2, ...
- IOI2008 island
题目链接:[IOI2008]Island 题目大意:求基环树直径(由于题目的意思其实是类似于每个点只有一个出度,所以在每个联通块中点数和边数应该是相同的,这就是一棵基环树,所以题目给出的图就是一个基环 ...
- MT【247】恒成立画图像
若$|x^2+|x-a|+3a|\le2$对任意$x\in[-1,1]$恒成立,则$a$ 的取值范围_____ 分析:转化为$f(x)=|x-a|+3a$的图像夹在$y=-2-x^2$与$y=2-x^ ...
- 信用算力基于 RocketMQ 实现金融级数据服务的实践
微服务架构已成为了互联网的热门话题之一,而这也是互联网技术发展的必然阶段.然而,微服务概念的提出者 Martin Fowler 却强调:分布式调用的第一原则就是不要分布式. 纵观微服务实施过程中的弊端 ...