问题

传送门

看到这个问题感觉很难???

不用怕,往下看就好啦

假如你不会CRT也没关系

EXCRT大致思路

先考虑将方程组两两联立解开,如先解第一个与第二个,再用第一个与第二个的通解来解第三个...(以此类推)

那么怎么解第一个与第二个同余方程呢?

\[\begin{cases}
x \equiv a_1 \pmod{b_1}\\
x \equiv a_2 \pmod{b_2}\\
.
.
.
\end{cases}
\]

则存在整数(注意不是非负),使得

\[\begin{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)快速入门的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 中国剩余定理(crt)和扩展中国剩余定理(excrt)

    数论守门员二号 =.= 中国剩余定理: 1.一次同余方程组: 一次同余方程组是指形如x≡ai(mod mi) (i=1,2,…,k)的同余方程构成的组 中国剩余定理的主要用途是解一次同余方程组,其中m ...

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

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

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

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

  9. 欧几里得(辗转相除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* ...

随机推荐

  1. 【FLASK】使用ORM以及类似于Django更新新增字段

    #!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base ...

  2. modelviewset settings 配置

    # 过滤器 # 1,安装 django-filter # 2,注册应用 # 3,配置settings, 在view里配置可过滤的字段 # 4,使用 查询字符串携带过滤信息 REST_FRAMEWORK ...

  3. 使用Redis做消息队列

    基于内存的单线程数据库,使Redis的线程安全性极高.而Redis的双向链表数据类型(List)天生就可作为消息队列存储消息. 在这里就不说消息队列的等等一些优点.但是补充一下Redis的List类型 ...

  4. python基础知识 变量 数据类型 if判断

    cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类的大脑 飞机 内存:暂时存储一些数据,临时加载数据和应用程序 4G 8G 16G 32G 速度快,高铁 断电即消失 造价高 硬盘 ...

  5. 题目:写出一条SQL语句,查询工资高于10000,且与他所在部门的经理年龄相同的职工姓名。

    create table Emp( eid char(20) primary key, ename char(20), age integer check (age > 0), did char ...

  6. 039 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 01 循环结构概述

    039 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 01 循环结构概述 本文知识点:循环结构概述 循环结构主要内容 while 循环 do-whiile ...

  7. C++重载>>和<<(输入和输出运算符)详解

    转载:http://c.biancheng.net/view/2311.html 在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据 ...

  8. 【题解】Tree

    题目戳我 \(\text{Solution:}\) 考虑点分治.对于这个两点之间,它意味着这点对必须是不一样的. 考虑用双指针统计答案.显然,对于两个数\(a,b\),要让\(a+b=k,a\)越大则 ...

  9. linux内核输入子系统分析

    1.为何引入input system? 以前我们写一些输入设备(键盘.鼠标等)的驱动都是采用字符设备.混杂设备处理的.问题由此而来,Linux开源社区的大神们看到了这大量输入设备如此分散不堪,有木有可 ...

  10. volatile、ThreadLocal的使用场景和原理

    并发编程中的三个概念 原子性 一个或多个操作.要么全部执行完成并且执行过程不会被打断,要么不执行.最常见的例子:i++/i--操作.不是原子性操作,如果不做好同步性就容易造成线程安全问题. 可见性 多 ...