题目链接

https://www.luogu.org/problemnew/show/P4777

分析

扩展\(CRT\)就是解决模数不互质的情况,说是扩展\(CRT\),其实都是扩欧...

先来考虑两个方程的情况:\(x \equiv a \mod b\)和\(x \equiv c \mod d\)

由方程1得\(x=tb+a\),代入方程2中得\(tb+a \equiv c \mod d\),

把它变得更像方程:\(t \times b+t' \times d = c-a\)

解得\(t'\)后回代即可

那么对于多个方程组,假设对于前\(k\)个方程组我们已经求出一个解\(x\),记\(M= \prod_{i=1}^k m_i\),那么显然\(x+i \times M\)是前\(k\)个方程的一个通解,因为\(M \equiv 0 \mod m_i (i<=k)\)

那么我们要求的就是一个整数\(t\),使得\(x+ t \times M \equiv b _ {k+1} \mod m _ {k+1}\)

移项得\(t \times M + t' \times m _ {k+1} = b _ {k+1}- x\)(这里的\(x\)其实是已知的)

运用扩欧算出\(t\),更新\(x=x+t \times M\),然后\(M= M \times m _ {k+1}\)

当然无解的情况也就是扩欧无解的情况,当\(b _ {k+1}-x\)不整除\(gcd(M,m _ {k+1})\)时无解

注意

题目要求要将\(x\)化为最小整数解

代码

#include <cstdio>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#define ll __int128
#define ri register int
using std::min;
using std::max;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=100005;
const int inf=0x7fffffff;
ll b[maxn],m[maxn];
int n;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){x=1,y=0;return a;}
ll d=exgcd(b,a%b,x,y);
ll z=x;x=y,y=z-a/b*y;
return d;
}
void print(ll x){
if(!x) return;
if(x) print(x/10);
putchar(x%10+'0');
}
ll ans=0;
int main(){
ll x,y,M,aa,bb,cc,d;
bool flag=0;
read(n);
for(ri i=1;i<=n;i++){
read(m[i]),read(b[i]);
}
M=m[1],ans=b[1];
for(ri i=2;i<=n;i++){
aa=M,bb=m[i],cc=(b[i]-ans%bb+bb)%bb;
x=0,y=0;
//if(aa<bb) d=exgcd(bb,aa,x,y);
//else d=exgcd(aa,bb,x,y);
/*错误点:不要加if不然这样的话方程都改变了,感觉我是真的傻*/
d=exgcd(aa,bb,x,y);
bb=bb/d;
if(cc%d){flag=1;break;}
x=((x*cc/d)%bb+bb)%bb;
/*错误点:要先×cc再除d,因为cc保证是d的倍数*/
ans+=M*x;M*=bb;
ans=(ans%M+M)%M;
}
if(flag)puts("-1");
else {
if(!ans)puts("0");
else {print(ans);puts("");}
//printf("%lld\n",ans);
}
return 0;
}

luogu4777[模板]拓展中国剩余定理题解的更多相关文章

  1. 拓展中国剩余定理(ex_crt)

    一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...

  2. 拓展中国剩余定理(exCRT)摘要

    清除一个误区 虽然中国剩余定理和拓展中国剩余定理只差两个字,但他俩的解法相差十万八千里,所以会不会CRT无所谓 用途 求类似$$\begin{cases}x \equiv b_{1}\pmod{a_{ ...

  3. E - Two Arithmetic Progressions(CodeForces - 710D)(拓展中国剩余定理)

    You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x such ...

  4. C++实现,拓展中国剩余定理——解同余方程组(理论证明和代码实现)

    拓展中国剩余定理 前言 记得半年前还写过关于拓展中国剩余定理的博客...不过那时对其理解还不是比较深刻,写的也比较乱. 于是趁学校复习之机,再来重温一下拓展中国剩余定理(以下简称ExCRT) 记得半年 ...

  5. 2019牛客暑期多校训练营(第十场) Han Xin and His Troop (高精度+拓展中国剩余定理)

    题意 裸题 思路 题中的模数之间并不互质,所以应该用拓展中国剩余定理. 但是交上去会炸,__int128过不了,所以用高精度的板子或者java大数都挺好过的. 这里推荐java大数,因为高精度板子用起 ...

  6. POJ-2891 Strange Way to Express Integers(拓展中国剩余定理)

    放一个写的不错的博客:https://www.cnblogs.com/zwfymqz/p/8425731.html POJ好像不能用__int128. #include <iostream> ...

  7. 中国剩余定理及其拓展 CRT&EXGCD

    中国剩余定理,又叫孙子定理. 作为一个梗广为流传.其实它的学名叫中国单身狗定理. 中国剩余定理 中国剩余定理是来干什么用的呢? 其实就是用来解同余方程组的.那么什么又是同余方程组呢. 顾名思义就是n个 ...

  8. 中国剩余定理(CRT)及其拓展(ExCRT)

    中国剩余定理 CRT 推导 给定\(n\)个同余方程 \[ \left\{ \begin{aligned} x &\equiv a_1 \pmod{m_1} \\ x &\equiv ...

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

    引入 常想起在空间里见过的一些智力题,这个题你见过吗: 一堆苹果,\(3\)个\(3\)个地取剩\(1\)个,\(5\)个\(5\)个地取剩\(1\)个,\(7\)个\(7\)个地取剩\(2\)个,苹 ...

随机推荐

  1. WIN7+Qt5.2.0连接oracle数据库的oci驱动的编译

    一.前提安装 1.需要安装QT5.2.0,本介绍安装的是qt-windows-opensource-5.2.0-mingw48_opengl-x86-offline.exe: 本文安装目录:c:\Qt ...

  2. udp如何实现可靠性传输?

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   1udp与tcp的区别 TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的 ...

  3. JavaWeb——Get、Post请求中文乱码问题

    最近在重温JavaWeb基础内容,碰到了之前也时常遇到的中文乱码问题,想着反正是经常要处理的,不如当即就把它整理出来放在博客里,省得遇到时再去到处搜. 1. Post请求乱码的解决方案: 手工创建一个 ...

  4. linux内核中rtc框架选用什么接口来注册rtc设备呢?

    1. 有哪些接口? 1.1 devm_rtc_device_register 1.2  devm_rtc_allocate_device和 rtc_register_device 2. 1.1与1.2 ...

  5. Android 屏幕适配之dimens适配

    Android 屏幕适配之dimens适配     转  https://blog.csdn.net/github_2011/article/details/72636851 在过去多个项目中一直使用 ...

  6. Docker 官方安装详解

    # 0x00 安装热身 - 针对CE版本 Docker 分为 CE 和 EE 版本, CE免费,EE收费,CE版以及能够满足我们所有需求 本文针对 CE 版本的安装进行说明 - 系统说明 本文以 Ce ...

  7. python 内置数据结构 切片

    切片 通过索引区间访问线性结构的一段数据 sequence[start:stop] 表示返回[start,stop]区间的子序列 支持负索引 start为0,可以省略 stop为末尾,可以省略 超过上 ...

  8. ubuntu kylin 18.04安装docker笔记

    删除原有的docker应用(如果有的话): sudo apt-get remove docker docker-engine docker.io 更新一下: sudo apt-get update 下 ...

  9. 一个小故事,玩转Python-while循环

    无论是传统编程场景还是当下火爆的人工智能应用场景,循环的应用都是必不可少的,上一篇文章中阐述了如何使用for循环来进行编程,这篇文章将会由一个小朋友经常听的故事来讲Python编程中的while循环. ...

  10. CG标准函数