扩展中国剩余定理(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* ...
 
随机推荐
- IntegerCache的妙用和陷阱!
			
考虑下面的小程序,你认为会输出为什么结果? public class Test { public static void main(String\[\] args) { Int ...
 - 微服务实战系列(十)-网关高可用之中间件Keepalived
			
1.场景描述 因为要做网关的高可用,用到了keepalived+nginx,来保证nginx的高可用,如下图: 安装了keepavlived,走了一些弯路,记录下吧,nginx的安装就不多说了,博客已 ...
 - Python正则表达式 re.sub()函数:标志位flags与参数个数问题
			
这两天在写爬虫程序,涉及英文文本处理,需要规范化英文标点符号的写法.正常情况下,英文句号「.」后面需要保证有且只有一个空格,但也有例外情况,比如「i.e.」.「e.g.」.「P.S.」这种.由于无法预 ...
 - 编程源自生活:抽象 -> 生活中的洗头问题
			
设计背景: 我:头上的油揩给了手,手接触洗手液.洗手液伤头皮,这样头皮就不会和洗手液接触了. 具体执行过程描述: 1.手揩油 -> 2.取液体 3.->洗手 我:这是什么设计模式 ...
 - “酒香也怕巷子深” Smartflow-Sharp 工作流
			
导语 老话说得好,"酒香不怕巷子深"可是我又不是什么大咖,写得再好也没人知道.所以我今天准备再写写我的工作流组件,写得不好还请大家见谅.写文章对于我来说,有点感觉"茶壶里 ...
 - 00 在Windows环境中开发Cordova项目的准备工作
			
1.开发环境准备: 安装nodejs 安装Cordova 安装Visual Studio Code 安装nodejs步骤: 通过nodejs官网(https:/ ...
 - Combine 框架,从0到1  —— 5.Combine 常用操作符
			
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 常用操作符. 内容概览 前言 print breakpoint handleEve ...
 - Vue 网站首页加载优化
			
Vue 网站首页加载优化 本篇主要讲解 Vue项目打包后 vendor.js 文件很大 如何对它进行优化 以及开启Vue的压缩 和 nginx gzip 压缩的使用, 其他就是对接口优化等 1. v ...
 - Android和。net加密。
			
来源: Github: https://github.com/Pavel-Durov/CodeProject-Android-and-NET-Encryption 直接: Source Code (A ...
 - Centos7系统下Docker开启认证的远程端口2376配置教程
			
docker开启2375会存在安全漏洞 暴露了2375端口的Docker主机.因为没有任何加密和认证过程,知道了主机IP以后,,任何人都可以管理这台主机上的容器和镜像,以前贪图方便,只开启了没有认证的 ...