CRT&EXCRT学习笔记
非扩展
用于求解线性同余方程组 ,其中模数两两互质 .
先来看一看两个显然的定理:
1.若 x \(\equiv\) 0 (mod p) 且 y \(\equiv\) 0 (mod p) ,则有 x+y \(\equiv\) 0 (mod p)
2.若 x \(\equiv\) b (mod p) 且 y \(\equiv\) 0 (mod p), 则有 x+y \(\equiv\) b (mod p) (0$\leq $b<p)
则整个方程组可以写为
b1 \(\begin{bmatrix}1\\0\\0\end{bmatrix}\) + $\cdots $+ bi \(\begin{bmatrix}0\\1\\0\end{bmatrix}\) + $\cdots $ + bn \(\begin{bmatrix}0\\0\\1\end{bmatrix}\)
也就是说,想要求出最终方程组的解就只需要求出上面每个行列式的值。
考虑每个式子中,因为每两个模数之间两两互质,设 N=$ \sum_{i=1}^nm_i$
则GCD(\(\frac{N}{m_i}\) , mi) = 1 , N/mi即为其他模数的lcm,即为其他n-1个方程的解,第i个方程的解可以写成xi=N / mi * y
即 N/mi * y \(\equiv\) 1 (mod mi)
此方程等价于 N/mi * y + mi * z=1 ,可以用扩展欧几里得求解。
求出xi后 ,有 bi * xi $\equiv $ bi (mod mi)
最后整个方程组的解就为 X = $\sum_{i=1}^n b_i * x_i $ mod N
Code:
#include<stdio.h>
#define N 100
long long W[N],B[N],nn,T;
inline void exgcd(long long a,long long b,long long &x,long long &y){
if(!b){
x=1;y=0;
}else{
exgcd(b,a%b,x,y);
long long t=x;
x=y;
y=t-a/b*y;
}
}
inline long long China(long long k){
long long x,y,a=0,m,n=1;
for(long long i=0;i<k;i++) n*=W[i];
for(long long i=0;i<k;i++){
m=n/W[i];
exgcd(W[i],m,x,y);
a=a+y*B[i]*m;
}
a%=n;
while(a<=0) a+=n;
while(a>=n) a-=n;
return a;
}
signed main(){
scanf("%lld",&nn);
for(long long i=0;i<nn;i++)
scanf("%lld",&B[i]);
for(long long i=0;i<nn;i++)
scanf("%lld",&W[i]);
for(long long i=0;i<nn;i++)
B[i]=(B[i]%W[i]+W[i])%W[i];
printf("%lld",China(nn));
}
扩展
刚刚学习了中国剩余定理,现在来学习它的扩展。先说句闲话,不知道是不是扩展过头了,其实中国剩余定理和它的扩展关系不大,所以先请忘记刚刚在上文所看到的一切套路,开始新的征程。
好了,现在模数不是两两互质的了,也就是说先前求的N不是它们的LCM,不能直接用。
我们考虑构造的方法,假设我们已经求出了前k-1个方程的和解,现在需要合并第k个方程。
设前k-1个方程的和解为X,则他们的通解可以写成 X + t * N (其中N为前k-1个模数的LCM)
则要合并第k个方程,即要解如下方程
\]
此方程又等价于 $$ t * N + m_k * y = b_k-X $$
晃眼一看,又是扩展欧几里得。求出 t 后 ,前k个方程的解就为 X' = X + t * N , 继续更新 N ,N = LCM(N,\(m_k\))
Code:
#include<stdio.h>
#define N 100006
#define ll long long
ll a[N],b[N],ans,B,M,GCD,x,y;
int n;
template<class T>
inline void read(T &x){
x=0;T flag=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') flag=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}
x*=flag;
}
inline ll exgcd(ll a,ll b,ll &xx,ll &yy){
if(!b){
xx=1;yy=0;
return a;
}
ll gcd=exgcd(b,a%b,xx,yy);
ll tmp=xx;
xx=yy;
yy=tmp-(a/b)*yy;
return gcd;
}
inline ll mul(ll a,ll b,ll Mod){
ll ans=0;
while(b){
if(b&1) ans=(ans+a)%Mod;
a=(a<<1)%Mod;
b>>=1;
}
return ans;
}
int main(){
read(n);
for(int i=1;i<=n;i++)
read(a[i]),read(b[i]);
ans=b[1];
M=a[1];
for(int i=2;i<=n;i++){
B=(b[i]-ans%a[i]+a[i])%a[i];
GCD=exgcd(M,a[i],x,y);
x=mul(x,B/GCD,a[i]);
ans+=M*x;
M*=a[i]/GCD;
ans=(ans%M+M)%M;
}
printf("%lld",ans);
}
/*
3
11 6
25 9
33 17
*/
CRT&EXCRT学习笔记的更多相关文章
- CRT & EXCRT 学习笔记
这玩意解决的是把同余方程组合并的问题. CRT的核心思想和拉格朗日插值差不多,就是构造一组\(R_i\)使得$\forall i,j(i \neq j) $ \[R_im_i = 1, R_im_j ...
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- CRT和EXCRT学习笔记
蒟蒻maomao终于学会\(CRT\)啦!发一篇博客纪念一下(还有防止忘掉) \(CRT\)要解决的是这样一个问题: \[x≡a_1(mod m_1)\] \[x≡a_2(mod m_2)\] ...
- crt,excrt学习总结
\(crt,Chinese\ Remainder\ Theorem\) 概述 前置技能:同余基础性质,\(exgcd\). \(crt\),中国剩余定理.用于解决模数互质的线性同余方程组.大概长这样: ...
- 「中国剩余定理CRT」学习笔记
设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(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 改变本地上 ...
- [笔记] CRT & exCRT
[笔记] CRT & exCRT 构造法 求多组\(x \equiv r_i (\bmod d_i)\)的解,\(d_i\)互质 余数\((r_i = remainder)\),除数\((d_ ...
- 扩展中国剩余定理(EXCRT)学习笔记
扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...
随机推荐
- Pwn-level3(x64)
题目地址 https://dn.jarvisoj.com/challengefiles/level3_x64.rar.8c74c402b190ac3fbef5a9ae540c40de 跟level3差 ...
- Pwn-level2(x64)
题目地址 https://dn.jarvisoj.com/challengefiles/level2_x64.04d700633c6dc26afc6a1e7e9df8c94e 已经知道了它是64位了, ...
- 201871010113-刘兴瑞《面向对象程序设计(java)》第二周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ...
- day73_10_18视图家族与序列化的传参。
一.序列化传参 在视图类中实例化序列对象时,还有一个参数为context,这个参数是存放字典,将所有从前端传来的数据传输到序列化中,比如需要在序列化中校验当前用户. 传入的request参数也是一个对 ...
- lua 11 闭包,函数的使用
转自:http://book.luaer.cn/_41.htm 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界.虽然这看起来很清楚,事实并非如此 ...
- 2019 SDN阅读作业
2019 SDN阅读作业 1.为什么需要SDN?SDN特点? 答:因为随着网络规模的不断扩大,封闭的网络设备内置了过多的复杂协议,增加了运营商定制优化网络的难度,科研人员无法在真实环境中规模部署新协议 ...
- linux-部署2
gunicorn+supervisor 1.gunicorn 安装: pip3 install gunicorn 配置: 两种方式:命令和文件,因为配置项比较多,所以放在文件里,启动时指明配置文件即可 ...
- AtCoder Grand Contest 037
Preface 这篇咕了可能快一个月了吧,正好今天晚上不想做题就来补博客 现在还不去复习初赛我感觉我还是挺刚的(微笑) A - Dividing a String 考虑最好情况把每个字符串当作一个来看 ...
- 小明工具箱<Excel 插件><VSTO 插件>
当前版本:1.0.42.7118(更新日期:2019年6月28日) 下载地址:点击下载 功能和简介: 本程序为 Excel 2010 版本以上的插件,含以下功能: 拆分工作簿:将一个或多个工作簿中的每 ...
- VBA基础 - 数据类型
概要 学习一种新语言, 数据类型和关键字是第一步. 数据类型 常用的数据类型如下: 类型 存储空间 范围 Boolean 2 bytes True 或者 False Byte 1 byte 0 ~ 2 ...