扩展中国剩余定理 exCRT 学习笔记
前言
由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了。
这么抽象的东西我怎么可能会写
前置技能
- gcd/lcm
- exgcd
- 快速乘
参考资料
- 一篇未通过的洛谷日报 by AH_ljq
- 比较直观的 exCRT 学习笔记 by Milky Way
- 我之前写过的 exgcd 学习笔记
- huyufeifei 对 CRT 的劝退
用途
用于求一个关于 \(x\) 的同余方程组
\begin{matrix}
x\equiv a_1\pmod{b_1}\\\
x\equiv a_2\pmod{b_2}\\\
\cdots\\\
x\equiv a_n\pmod{b_n}
\end{matrix}\right.
\]
的解。
解法推导
考虑到如果 \(x\) 对原方程组成立,那么 \(x\) 对其中任意几个方程也都成立。那么如果要满足 \(x\) 对前 \(i\) 个方程都成立,一个必要条件是对前 \(i-1\) 个方程都成立。
采用一种类似“增量法”的思路来合并每个式子。
假定前 \(i-1\) 个式子已经合并完了,得到 \(x\equiv a_{i-1}\pmod{b_{i-1}}\)。此时合并
\begin{aligned}
&x\equiv a_{i-1}&\pmod{b_{i-1}}\\\
&x\equiv a_i&\pmod{b_i}
\end{aligned}\right.
\]
它的本质是存在 \(k_1,k_2\),满足(上下颠倒了一下,方便下面推导)
\begin{aligned}
&x+k_1b_i=a_i\\\
&x+k_2b_{i-1}=a_{i-1}
\end{aligned}\right.
\]
两式相减,得到
\]
此时,仅有 \(k_1,k_2\) 是变量,剩下的都已知。但是我们用 exgcd 解方程时,要求等式右边是 \(\gcd(b_i,b_{i-1})\)。此时我们列出一个新方程
\]
解出 \(k_1'\) 的一个特解 \(k_0\)。
那么为了满足新方程和原方程都成立,那么
\]
因此 \(k_1\) 有特解
\]
则 \(k_1\) 的通解是
\]
不定方程的通解
对于 \(ax+by=c\) 这个方程,假定我们已经解出来一组解为
\[\left\{
\begin{matrix}
x=x_0\\\
y=y_0
\end{matrix}
\right.
\]我们带入后对左侧式子变形,得到 \(ax_0+S+by_0-S=c\)。
我们要从 \(ax_0+S\) 中提一个 \(a\) 出来,从 \(by_0-S\) 中提一个 \(b\) 出来,得到 \(a(x_0+\frac Sa)+b(y_0-\frac Sb)=c\)。
此时最小的满足 \(x_0+\frac Sa,\ y_0-\frac Sb\) 都是整数的 \(S\) 就是 \(a,b\) 的最小公倍数了。
那么每个相邻的 \(x\) 之间相差 \(\frac Sa=\frac{\operatorname{lcm}(a,b)}a=\frac b{\gcd(a,b)}\),即 \(x\) 的通解为 \(x_0+t\times \frac b{\gcd(a,b)},\ t\in \mathbb Z\)。
后面的式子仅与 \(a,b\) 有关。
又因为
\]
我们带入 \(k_1\) 的通解,得
\]
化简
t\times\operatorname{lcm}(b_i,b_{i-1})=a_i-x-b_ik_{1_0},\ t\in \mathbb Z
\]
由于 \(t\in \mathbb Z\),所以
a_i-x-b_ik_{1_0}\equiv 0\pmod{\operatorname{lcm}(b_i,b_{i-1})}\\\
x\equiv a_i-b_ik_{1_0}\pmod{\operatorname{lcm}(b_i,b_{i-1})}
\]
\(\equiv\) 符号右边的都是已知量,这时我们就把两个方程结合到一块了。
我们依次合并 \((2)=[(1),(2)],(3)=[(2),(3)],\cdots,(n)=[(n-1),(n)]\),最终得到第 \(n\) 个式子
\]
(\(a_n\) 是合并 \(n-1\) 个式子后的新 \(a_n\),上述过程中每一步都会更新 \(a_i\))
此时 \(a_n\) 就是解了,取模取正数就是最小正整数解。
(上下两部分实质相同)
解法简述
对于
\begin{aligned}
&x\equiv a_{i-1}&\pmod{b_{i-1}}\\\
&x\equiv a_i&\pmod{b_i}
\end{aligned}\right.
\]
有
\begin{aligned}
&x+k_1b_i=a_i\\\
&x+k_2b_{i-1}=a_{i-1}
\end{aligned}\right.
\]
解出
\]
的特解 \(k_1'\),两边同乘 \(\frac{a_i-a_{i-1}}{\gcd(b_i,b_{i-1})}\),得到
\]
那么 \(k_ 1'\) 也被乘了 \(\frac{a_i-a_{i-1}}{\gcd(b_i,b_{i-1})}\),因此 \(k_1\) 有特解
\]
而 \(k_1\) 的通解是
\]
代回去就是
\]
得到
\]
作为第 \(i\) 个方程即可。
注意事项
在 \(k_1,k_{1_0},a_i\) 的计算中是有可能爆 long long 的,而这三个计算恰好又都是模意义下,所以使用快速乘。
一般情况下不考虑 \(\operatorname{lcm}(b_1,b_2,\cdots,b_n)\) 爆 long long 的情况。
代码
#include<cstdio>
#define ll long long
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return a;
}
ll g=exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
ll qmul(ll x,ll y,ll p)
{
ll ans=0,f=1;
if(x<0)
{
x=-x;
f=-f;
}
if(y<0)
{
y=-y;
f=-f;
}
while(y)
{
if(y&1)
ans=(ans+x)%p;
x=(x+x)%p;
y>>=1;
}
return ans*f;
}
ll a[100100],b[100100];
int main()
{
int n;
ll x,y;
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%lld%lld",&b[i],&a[i]);
for(int i=2;i<=n;++i)
{
ll g=exgcd(b[i],b[i-1],x,y);
ll t=b[i-1]/g;//k1 的最小波动 Δ
x=qmul(x,(a[i]-a[i-1])/g,t);
x=(x%t+t)%t;
a[i]-=qmul(x,b[i],b[i]/g*b[i-1]);
b[i]=b[i]/g*b[i-1];
a[i]=(a[i]%b[i]+b[i])%b[i];
}
printf("%lld\n",(a[n]%b[n]+b[n])%b[n]);
return 0;
}
扩展中国剩余定理 exCRT 学习笔记的更多相关文章
- 扩展中国剩余定理 (ExCRT)
扩展中国剩余定理 (ExCRT) 学习笔记 预姿势: 扩展中国剩余定理和中国剩余定理半毛钱关系都没有 问题: 求解线性同余方程组: \[ f(n)=\begin{cases} x\equiv a_1\ ...
- 扩展中国剩余定理 (exCRT) 的证明与练习
原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...
- 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结
中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...
- 扩展中国剩余定理(EXCRT)快速入门
问题 传送门 看到这个问题感觉很难??? 不用怕,往下看就好啦 假如你不会CRT也没关系 EXCRT大致思路 先考虑将方程组两两联立解开,如先解第一个与第二个,再用第一个与第二个的通解来解第三个... ...
- CRT(中国剩余定理)学习笔记
先扔个模板题.链接. 简化题意:他让我求 \(x \equiv a_i \pmod{m_i}\) 的解. 例如,\( \begin{cases} x \equiv 1 \pmod{3} \\ x \e ...
- 扩展中国剩余定理(EXCRT)学习笔记
扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...
- P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers
P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...
- 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) \\ ... ...
随机推荐
- code1154 能量项链
d[l][i]表示:从第i个珠子开始,连续l个珠子合并后释放的最大能量 状态转移方程d[l][i] = d[j][i] + d[l-j][i+j] + w[i]*w[i+j]*w[i+l],j从1到l ...
- 洛谷 P1103 书本整理(动规)
洛谷 P1103 书本整理 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发 ...
- itunes win10应用商店安装 升级固件路径
win + r 在运行中输入: %localappdata%\Packages\AppleInc.iTunes_nzyj5cx40ttqa\LocalCache\Roaming\Apple Compu ...
- Part3_lesson1---ARM汇编编程概述
bootloader以及内核需要使用汇编语言,特别是在初始化的时候!以及在效率要求很高的地方会使用. 汇编程序框架: 其入口在_start处,这个入口需要用一个关键字为.global来声明它是一个全局 ...
- mongodb 查询条件
这节来说说mongodb条件操作符,"$lt", "$lte", "$gt", "$gte", "$ne&qu ...
- UVa 3211 Now or later (二分+2-Sat)
题意:有 n 架飞机,每个飞机早着陆,或者晚着陆,让你安排一个方式,让他们着陆的时间间隔尽量大. 析:首先对于时间间隔,可以用二分来解决,然后就成了一个判定性问题,然后怎么判断该时间间隔是不是成立呢, ...
- Linux上获取CPU Core个数的实现
Linux上获取CPU Core个数的实现 可以通过多种手段取得CPU Core的个数,如: 1) 调用系统提供的函数get_nprocs(),可以在头文件sys/sysinfo.h中发现它 2) 借 ...
- C++ 调用C++写的类库的2种方法之一(隐式链接)
一:创建C++ DLL类库,名称:Dll1 1.Dll1.h /*#ifndef Dll_API #else #define Dll_API _declspec(dllimport) #endif * ...
- [转]Control的Invoke和BeginInvoke
转自:Control的Invoke和BeginInvoke 作者:Kuffy Wang 近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下.感谢这篇文 ...
- LDAP 相关链接
http://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html细说ASP.NET Windows身份认证 http://www.cnblo ...
