扩展中国剩余定理(EXCRT)学习笔记

用途

求解同余方程组

\(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2}\left( mod\ m_{2}\right) \\ \ldots \\ x\equiv c_r\left( mod\ m_r\right) \end{cases}\)

其中 \(m_1,m_2,m_3...m_k\) 为不一定两两互质的整数, 求 \(x\) 的最小非负整数解。

求法

考虑两两合并同余方程,使得新得到的同余方程满足之前两个同余方程的限制条件。

这样合并到最后只剩下一个同余方程直接输出答案即可。

对于两个同余方程 \(x\%a_1=b_1,x\%a_2=b_2\),

令 \(x=k_1a_1+b_1,x=k_2a_2+b_2\),

那么有 \(k_1a_1+b_1=k_2a_2+b_2\),

\(k_1a_1-k_2a_2=b_2-b_1\),

令 \(d=gcd(a_1,a_2)\),如果 \((b_2-b_1)\%d \ne 0\),那么无解。

否则对于方程两边同时除以 \(d\),

\(k_1\frac{a_1}{d}-k_2\frac{a_2}{d}=\frac{b_2-b_1}{d}\),

\(k_1\frac{a_1}{d}=\frac{b_2-b_1}{d}+k_2\frac{a_2}{d}\),

可以看作 \(k_1\frac{a_1}{d}\%\frac{a_2}{d}=\frac{b_2-b_1}{d}\),

令 \(inv=\frac{a_1}{d} \% \frac{a_2}{d}\) 意义下的逆元,

对于方程两边同时乘 \(inv\),

有 \(k_1\%\frac{a_2}{d}=\frac{inv(b_2-b_1)}{d}\),

展开后有 \(k_1=\frac{inv(b_2-b_1)}{d}+k_2\frac{a_2}{d}\),

代入开始的 \(x=a_1k_1+b_1\),

有 \(x=\frac{a_1inv(b_2-b_1)}{d}+k_2\frac{a_1a_2}{d}+b_1\),

把 \(\frac{a_1a_2}{d}\) 看成新的 \(a\),把 \(\frac{a_1inv(b_2-b_1)}{d}+b_1\) 看成新的 \(b\) 即可。

代码

【模板】扩展中国剩余定理(EXCRT)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define rg register
template<typename T>void read(rg T& x){
x=0;rg int fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=fh;
}
const int maxn=1e5+5;
int n;
long long a[maxn],b[maxn];
long long gcd(rg long long aa,rg long long bb){
return bb==0?aa:gcd(bb,aa%bb);
}
long long lcm(rg long long aa,rg long long bb){
return aa/gcd(aa,bb)*bb;
}
long long exgcd(rg long long aa,rg long long bb,rg long long&xx,rg long long&yy){
if(bb==0){
xx=1,yy=0;
return aa;
}
rg long long nans=exgcd(bb,aa%bb,xx,yy);
rg long long t=xx;
xx=yy;
yy=t-aa/bb*yy;
return nans;
}
long long getinv(rg long long val,rg long long mod){
rg long long xx,yy;
exgcd(val,mod,xx,yy);
return (xx%mod+mod)%mod;
}
long long gsc(rg long long ds,rg long long zs,rg long long mod){
return ((unsigned long long)(ds*zs)-(unsigned long long)((long double)ds/mod*zs)*mod+mod)%mod;
}
int main(){
read(n);
for(rg int i=1;i<=n;i++) read(a[i]),read(b[i]);
rg long long newa,newb,tmp;
for(rg int i=2;i<=n;i++){
newa=lcm(a[i],a[i-1]),tmp=gcd(a[i],a[i-1]);
newb=gsc((b[i]-b[i-1])/tmp,getinv(a[i-1]/tmp,a[i]/tmp),newa);
newb=gsc(newb,a[i-1],newa)+b[i-1];
newb=(newb%newa+newa)%newa;
a[i]=newa,b[i]=newb;
}
printf("%lld\n",b[n]);
return 0;
}

扩展中国剩余定理(EXCRT)学习笔记的更多相关文章

  1. 扩展中国剩余定理 exCRT 学习笔记

    前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...

  2. 扩展中国剩余定理 (ExCRT)

    扩展中国剩余定理 (ExCRT) 学习笔记 预姿势: 扩展中国剩余定理和中国剩余定理半毛钱关系都没有 问题: 求解线性同余方程组: \[ f(n)=\begin{cases} x\equiv a_1\ ...

  3. 扩展中国剩余定理 (exCRT) 的证明与练习

    原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...

  4. 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结

    中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...

  5. 扩展中国剩余定理(EXCRT)快速入门

    问题 传送门 看到这个问题感觉很难??? 不用怕,往下看就好啦 假如你不会CRT也没关系 EXCRT大致思路 先考虑将方程组两两联立解开,如先解第一个与第二个,再用第一个与第二个的通解来解第三个... ...

  6. CRT(中国剩余定理)学习笔记

    先扔个模板题.链接. 简化题意:他让我求 \(x \equiv a_i \pmod{m_i}\) 的解. 例如,\( \begin{cases} x \equiv 1 \pmod{3} \\ x \e ...

  7. P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers

    P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...

  8. P4777 【模板】扩展中国剩余定理(EXCRT)

    思路 中国剩余定理解决的是这样的问题 求x满足 \[ \begin{matrix}x \equiv a_1(mod\ m_1)\\x\equiv a_2(mod\ m_2)\\ \dots\\x\eq ...

  9. P4777 【模板】扩展中国剩余定理(EXCRT)&& EXCRT

    EXCRT 不保证模数互质 \[\begin{cases} x \equiv b_1\ ({\rm mod}\ a_1) \\ x\equiv b_2\ ({\rm mod}\ a_2) \\ ... ...

随机推荐

  1. js add Struct to ArrayBuffer

    使用struct-buffer为ArrayBuffer添加结构体 $ npm i struct-buffer 1. 创建结构体 import { DWORD, string_t, StructBuff ...

  2. 埋点 & 数据上报 & 数据异常处理

    埋点 & 数据上报 & 数据异常处理 如何在用户关闭浏览器前面,发送请求 beforeunload unload https://developer.mozilla.org/en-US ...

  3. NGK——解决区块链用户之“难”

    自比特币诞生以来,区块链行业已发展十余年,而且在在金融.民生.司法存证.供应链协同.税务发票.版权保护等领域得到一定程度的应用,但大多属于边缘业务,以探索试点为主,应用深度和广度不足.为什么会这样?是 ...

  4. 1. VUE介绍

    今天开始系统学习vue前端框架. 我是有前端基础的, 刚工作那会, 哪里分那么清楚啊, 前后端我都得做, 所以, css, js, jquery, bootstrap都会点, 还系统学过ext, 哈哈 ...

  5. C++算法代码——和为给定数

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?cid=1376&pid=0 题目描述 给出若干个整数,询问其中是否有一对数的和等于给 ...

  6. 《进击吧!Blazor!》第一章 5.组件开发

    <进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门系列视频,此系列能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...

  7. DRF的orm多表关系补充及serializer子序列化

    目录 一.控制多表关系的字段属性 1.如何建立基表 2.断开连表关系 3.四种级联关系 二.子序列化 一.控制多表关系的字段属性 1.如何建立基表 要在基表中配置Meta,设置abstract=Tru ...

  8. 基于docker搭建jenkins

    一.概述 Jenkins 的前身是 Hudson 是一个可扩展的持续集成引擎.Jenkins 是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件.Jenkins 支持各 ...

  9. centos7.5+nginx+php急速配置

    centos7.5+nginx+php急速配置 centosnginxphp 更新系统以及添加源 yum update yum -y install epel-release 安装php以及配置 yu ...

  10. Linux下搭建RocketMQ环境

    Apache 官网: http://rocketmq.apache.org/ RocketMQ 的 Github 地址: English:https://github.com/apache/rocke ...