拓展中国剩余定理(exCRT)摘要
清除一个误区
虽然中国剩余定理和拓展中国剩余定理只差两个字,但他俩的解法相差十万八千里,所以会不会CRT无所谓
用途
求类似$$\begin{cases}x \equiv b_{1}\pmod{a_{1}} \\x \equiv b_{2}\pmod{a_{2}} \\...\\x \equiv b_{n}\pmod{a_{n}} \\ \end{cases}$$的线性同余方程组的解
具体过程
假设现在我们只有两个同余方程$$x \equiv b_{1}\pmod{a_{1}}$$ $$x \equiv b_{2}\pmod{a_{2}}$$
改写它们得$$x=a_{1}k_{1}+b_{1} ①$$ $$x=a_{2}k_{2}+b_{2}$$
联立$$a_{1}k_{1}+b_{1}=a_{2}k_{2}+b_{2}$$
所以$$a_{1}k_{1}=b_{2}-b_{1}+a_{2}k_{2}$$
记$$c=gcd(a_{1},a_{2})$$ $$d_{1}=\frac{a_{1}}{c}$$ $$d_{2}=\frac{a_{2}}{c}$$
两边同除以$c$得$$d_{1}k_{1}=\frac{b_{2}-b_{1}}{c}+d_{2}k_{2}$$
即$$d_{1}k_{1} \equiv \frac{b_{2}-b_{1}}{c}\%d_{2}\pmod{d_{2}}$$
显然,方程组有解的条件是$c|(b_{2}-b_{1})$
为什么要在这个时候取模$\%d_{2}$?因为之后取模的时候模数和被模数已经不互质了
记$d_{1}$在模$d_{2}$意义下的逆元为$p$,两边同乘$p$得$$k_{1} \equiv \frac{p(b_{2}-b_{1})}{c}\%d_{2} \pmod{d_{2}}$$
即$$k_{1} = \frac{p(b_{2}-b_{1})}{c}\%d_{2}+d_{2}*y$$
带入①式得$$x=\frac{p(b_{2}-b_{1})}{c}\%d_{2}*a_{1}+d_{2}a_{1}y+b_{1}$$
即$$x \equiv \frac{p(b_{2}-b_{1})}{c}\%d_{2}*a_{1}+b_{1}\pmod{a_{1}d_{2}}$$
注意,上式中的$a_{1}$万万不可乘到$\%d_{2}$前面
所以我们就弄出了一个新的同余方程。这个方程也可以写成$$x \equiv b \pmod a$$其中$$b=(inv(\frac{a_{1}}{(a_{1},a_{2})},\frac{a_{2}}{(a_{1},a_{2})})*\frac{b_{2}-b_{1}}{(a_{1},a_{2})}\%\frac{a_{2}}{(a_{1},a_{2})}*a_{1}+b_{1})$$ $$a=\frac{a_{1}a_{2}}{(a_{1},a_{2})}$$
其中$inv(m,n)$表示$m$在模$n$意义下的逆元,$(m,n)$表示$m$和$n$的最大公约数
然后把新求出的方程和后面的方程联立,迭代求解,直到只剩一个方程
精度问题
毫无疑问的是,在求解方程组的时候很容易爆$long long$,那该怎么办呢?
__int128 快(龟)速(速)乘(乘)是个不错的主意。
何为快速乘?
就是一种和快速幂类似的东西,利用二进制在log时间内求出两个数相乘对另一个数取模的结果并且不会爆long long
但要注意的是,千万不要让负数出现在快速乘里面,尤其是被拆分的那个乘数,会死循环的
int mul(int x,int k,int mod) {
ll ans=;
while(k) {
if(k&)(ans+=x)%=mod;
k>>=;
(x<<=)%=mod;
}
return ans;
}
快速乘
题目
#include<bits/stdc++.h>
using namespace std;
#define INF 0x7fffffff
#define ME 0x7f
#define FO(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define fui(i,a,b,c) for(int i=(a);i<=(b);i+=(c))
#define fdi(i,a,b,c) for(int i=(a);i>=(b);i-=(c))
#define fel(i,a) for(register int i=hd[a];i;i=dg[i].nxt)
#define ll long long
#define int long long
#define MEM(a,b) memset(a,b,sizeof(a))
#define maxn 100010
ll n;
ll a[maxn],b[maxn],a0,b0;
template<class T>
inline T read(T &n){
n=;int t=;double x=;char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());(ch=='-')?t=-:n=ch-'';
for(ch=getchar();isdigit(ch);ch=getchar()) n=n*+ch-'';
if(ch=='.') for(ch=getchar();isdigit(ch);ch=getchar()) n+=(ch-'')/x,x*=;
return (n*=t);
}
template<class T>
T write(T n){
if(n<) putchar('-'),n=-n;
if(n>=) write(n/);putchar(n%+'');return n;
}
template<class T>
T writeln(T n){write(n);putchar('\n');return n;}
int exgcd(int a,int b,int &x,int &y){
if(!b)return a+((x=)*(y=));
int xx,yx,z;z=exgcd(b,a%b,xx,yx);
x=yx,y=xx-a/b*yx;return z;
}
int gcd(int a,int b){if(!b)return a;return gcd(b,a%b);}
int mul(int x,int k,int mod){
ll ans=;
while(k){
if(k&)(ans+=x)%=mod;
k>>=;
(x<<=)%=mod;
}
return ans;
}
signed main(){
read(n);
fui(i,,n,)read(a[i]),read(b[i]);
a0=a[],b0=b[];
fui(i,,n,){
int c=gcd(a0,a[i]),d1=a0/c,d2=a[i]/c,p,x,y;
int a1=a0,a2=a[i],b1=b0,b2=b[i];
if(((b2-b1)/c*c)^(b2-b1))return *writeln(-);
exgcd(d1,d2,p,y);((p%=d2)+=d2)%=d2;
x=mul(p,(((b2-b1)/c)%d2+d2)%d2,d2)*a1+b1;
y=a1*d2;b0=x,a0=y;((b0%=a0)+=a0)%=a0;
}
int x,y;exgcd(,a0,x,y);
((x%=a0)+=a0)%=a0;
x=mul(x,b0,a0);
writeln(x);
return ;
}
AC代码
好像还有NOI2018屠龙勇士?23333先等我去A掉它
拓展中国剩余定理(exCRT)摘要的更多相关文章
- C++实现,拓展中国剩余定理——解同余方程组(理论证明和代码实现)
拓展中国剩余定理 前言 记得半年前还写过关于拓展中国剩余定理的博客...不过那时对其理解还不是比较深刻,写的也比较乱. 于是趁学校复习之机,再来重温一下拓展中国剩余定理(以下简称ExCRT) 记得半年 ...
- 拓展中国剩余定理(ex_crt)
一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...
- 扩展中国剩余定理 (exCRT) 的证明与练习
原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...
- 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结
中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...
- 扩展中国剩余定理 (ExCRT)
扩展中国剩余定理 (ExCRT) 学习笔记 预姿势: 扩展中国剩余定理和中国剩余定理半毛钱关系都没有 问题: 求解线性同余方程组: \[ f(n)=\begin{cases} x\equiv a_1\ ...
- E - Two Arithmetic Progressions(CodeForces - 710D)(拓展中国剩余定理)
You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x such ...
- 2019牛客暑期多校训练营(第十场) Han Xin and His Troop (高精度+拓展中国剩余定理)
题意 裸题 思路 题中的模数之间并不互质,所以应该用拓展中国剩余定理. 但是交上去会炸,__int128过不了,所以用高精度的板子或者java大数都挺好过的. 这里推荐java大数,因为高精度板子用起 ...
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- 中国剩余定理(excrt) 模板
excrt板子题 #include <cmath> #include <cstdio> #include <cstring> #include <algori ...
随机推荐
- 浅谈个人对RAID技术的理解
RAID,字面意思为一种廉价的冗余磁盘阵列,它是通过将大量的磁盘分组,实现了数据冗余,目的是为了保护数据.RAID现已经应用于计算机各个领域.它的优点是降低了工作成本并提高了效率,并且使系统有稳定的运 ...
- 弟三周作业之VS2015
这周有个任务就是安装VS2015,然后进行简单的单元测试. 首先我上吴小勇同学给的MSDN官网(http://www.itellyou.cn/)下载VS2013, 然后装上后,在工具栏里,点击工具里的 ...
- VS2013新建web项目时出错,系统找不到指定文件
好不容易找了一个VS2013_RTM_ULT_CHS来安装好,Key:BWG7X-J98B3-W34RT-33B3R-JVYW9 兴高采烈的打开vs2013,新建web项目,结果弹出一个错误: 傻眼了 ...
- java 强制转换之降级
大空间的数据类型向小空间的数据类型去转换. 语法:(目标数据类型)变量名 当大空间数据类型转换给小空间时且超过小空间的容量时,编译不会出错,但是会丢失精度 例如 int a = 128 抓换byte ...
- bzoj 1050 [HAOI2006]旅行comf (并查集)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 思路: 先将每条边的权值排个序优先小的,然后从小到大枚举每一条边,将其存到并查集 ...
- MT【188】一个正切余切有关的恒等式
(2017北大特优)求$9\tan 10^\circ+2\tan 20^\circ+4\tan 40^\circ-\tan 80^\circ=$_____ A.$0$ B.$\dfrac{\sqrt ...
- 自学huawei之路-6005-8AP设备启动界面
返回自学Huawei之路 自学huawei之路-AC6005-8AP设备启动界面 [YK-MES-MASTER] Please check whether system data has been c ...
- 【bzoj3992】 SDOI2015—序列统计
http://www.lydsy.com/JudgeOnline/problem.php?id=3992 (题目链接) 题意 集合${S}$中有若干个不超过${m}$的非负整数,问由这些数组成一个长度 ...
- python 用Threading创建多线程
#-*-coding:utf-8-*- '''python标准库提供了两个多线程模块,分别为thread和threading, 其中thread模块是低级模块,threading是高级模块,对thre ...
- 解题:SHOI 2014 概率充电器
题面 显然就是在求概率,因为期望乘的全是1....然后就推推推啊 设$fgg[i]$表示这个点父亲没给他充上电的概率,$sgg[i]$表示这个点子树(和它自己)没给他充上电的概率,然后这个点没充上电的 ...