扩展中国剩余定理(EXCRT)快速入门
问题
看到这个问题感觉很难???
不用怕,往下看就好啦
假如你不会CRT也没关系
EXCRT大致思路
先考虑将方程组两两联立解开,如先解第一个与第二个,再用第一个与第二个的通解来解第三个...(以此类推)
那么怎么解第一个与第二个同余方程呢?
x \equiv a_1 \pmod{b_1}\\
x \equiv a_2 \pmod{b_2}\\
.
.
.
\end{cases}
\]
则存在整数(注意不是非负),使得
x = a_1 +k_1 * b_1\\
x = a_2 +k_2 * b_2\\
\end{cases}
\]
所以有
$ a_1 +k_1*b_1$ \(=\) $a_2 +k_2 * b_2 $
移项可得
$ k_1*b_1 $ \(+\) $k_2*b_2=a_2-a_1 $
(注意这里可以是 $ k_1*b_1$ \(+\) $k_2*b_2 $ 因为 $ k_2 $ 可为负数)
不妨令\(a_2-a_1\)为\(c\)
然后发现这里长得很像我们的 扩展欧几里得 !!!
而根据裴蜀定理得,当且仅当 $gcd( k_1 , k_2 ) | c $ 时 该方程有整数解
所以我们可用exgcd求出 $ k_1*b_1+k_2*b_2=gcd(k_1,k_2) $
再等式两边同时乘以 $ c/gcd(k_1,k_2) $ 即可
这样就可以解出 此时的式子了
所以新的 A 为\(a_1+b_1*k_1\) ,新的B则为\(lcm(b_1,b_2)\)
然后再用新的A,B与\(a_3,b_3\)去计算就好
最后的答案就是最后算出来的A
代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define int __int128
#define in inline
#define get getchar()
in int read()
{
int t=0; char ch=get;
while(ch<'0' || ch>'9') ch=get;
while( ch<='9' && ch>='0') t=t*10+ch-'0', ch=get;
return t;
}
const int _=2e5+5;
int a[_],b[_],n;
void out(int x) {
if (!x) return;
out(x / 10);
putchar(x % 10 + '0');
}
in int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int g=exgcd(b,a%b,y,x);
y -= a / b * x;
return g;
}
in int mul(int a,int b,int mod)
{
int res=0;
while(b)
{
if(b&1)res=(res+a)%mod;
a=(a+a)%mod,b>>=1;
// cout<<b<<endl;
}
return res;
}
in int excrt()
{
int a1=a[1],b1=b[1];
for(re int i=2;i<=n;i++)
{
// printf("%d\n", i);
int a2=a[i],b2=b[i],x,y,c;
c=((a2-a1)%b2+b2)%b2;
int gcd=exgcd(b1,b2,x,y);
if(c%gcd) return -1;
x=mul(x,c/gcd,b2);
a1=a1+x*b1;
b1=b1*b2/gcd;
a1=(a1%b1+b1)%b1;
}
return a1;
}
signed main()
{
n=read();
for(re int i=1;i<=n;i++)
b[i]=read(),a[i]=read();
//cout<<excrt();
out(excrt());
return 0;
}
扩展中国剩余定理(EXCRT)快速入门的更多相关文章
- 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结
中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...
- 扩展中国剩余定理 (exCRT) 的证明与练习
原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...
- 扩展中国剩余定理 (ExCRT)
扩展中国剩余定理 (ExCRT) 学习笔记 预姿势: 扩展中国剩余定理和中国剩余定理半毛钱关系都没有 问题: 求解线性同余方程组: \[ f(n)=\begin{cases} x\equiv a_1\ ...
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers
P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...
- 中国剩余定理(crt)和扩展中国剩余定理(excrt)
数论守门员二号 =.= 中国剩余定理: 1.一次同余方程组: 一次同余方程组是指形如x≡ai(mod mi) (i=1,2,…,k)的同余方程构成的组 中国剩余定理的主要用途是解一次同余方程组,其中m ...
- P4777 【模板】扩展中国剩余定理(EXCRT)
思路 中国剩余定理解决的是这样的问题 求x满足 \[ \begin{matrix}x \equiv a_1(mod\ m_1)\\x\equiv a_2(mod\ m_2)\\ \dots\\x\eq ...
- P4777 【模板】扩展中国剩余定理(EXCRT)&& EXCRT
EXCRT 不保证模数互质 \[\begin{cases} x \equiv b_1\ ({\rm mod}\ a_1) \\ x\equiv b_2\ ({\rm mod}\ a_2) \\ ... ...
- 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍
1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...
随机推荐
- sping cloud入门
可以参考原文 https://www.cnblogs.com/sam-uncle/archive/2018/04/25/8943471.html 注册服务 https://www.cnblogs.co ...
- Spring学习(七)--Spring的AOP
1.实现AOP的方式:通过proxy代理对象.拦截器字码翻译等. 2.AOP体系分层图,从高到低,从使用到实现: 基础:待增强或者目标对象 切面:对基础的增强应用 配置:把基础和切面结合起来,完成切面 ...
- 为 MaixPy 加入软 I2C 接口(移植 MicroPython 的 I2C)
起因 本文的重心为讲解如何为一款芯片移植和实现 micropython 的通用组件,但会顺带解释不同芯片的工作方式和特性. 国际惯例,先有起因,再谈问题的解决,所以记得上次总结的 关于 K210 Ma ...
- python中def用法
转载:https://blog.csdn.net/qq_21466543/article/details/81604826 一.函数调用的含义 函数是类似于可封装的程序片段.允许你给一块语句一个名字, ...
- P3469 BLO-Blockade (缩点)
又可以水紫题了,好开心 前置芝士 无向图割点,然后脑子... 不会的童鞋,出门右转,百度百科...QAQ 首先,对于这道题,我们要求的是,割去每个点及他所连的边后,无向图中,有多少有序点对(\(x\) ...
- 【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?
前言 之前也分享过很多工作中踩坑的经验: 一个线上问题的思考:Eureka注册中心集群如何实现客户端请求负载及故障转移? [原创]经验分享:一个Content-Length引发的血案(almost.. ...
- RHSA-2017:2473-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权)
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- 拉格朗日乘子法与KKT条件
拉格朗日乘子法 \[min \quad f = 2x_1^2+3x_2^2+7x_3^2 \\s.t. \quad 2x_1+x_2 = 1 \\ \quad \quad \quad 2x_2+3x_ ...
- docker自定义网络里的dns实现原理
简单说一下流程吧,不写了. docker会修改容器里的/etc/resolv.conf文件,把dns服务器设置成127.0.0.11,因为127.0.0.0/8地址都是本机回环地址,所以dns查询的时 ...
- springboot2.2.2企业级项目整合redis与redis 工具类大全
1.springboot2.2.2整合redis教程很多,为此编写了比较完整的redis工具类,符合企业级开发使用的工具类 2.springboot与redis maven相关的依赖 <depe ...