luogu4777[模板]拓展中国剩余定理题解
题目链接
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[模板]拓展中国剩余定理题解的更多相关文章
- 拓展中国剩余定理(ex_crt)
一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...
- 拓展中国剩余定理(exCRT)摘要
清除一个误区 虽然中国剩余定理和拓展中国剩余定理只差两个字,但他俩的解法相差十万八千里,所以会不会CRT无所谓 用途 求类似$$\begin{cases}x \equiv b_{1}\pmod{a_{ ...
- E - Two Arithmetic Progressions(CodeForces - 710D)(拓展中国剩余定理)
You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x such ...
- C++实现,拓展中国剩余定理——解同余方程组(理论证明和代码实现)
拓展中国剩余定理 前言 记得半年前还写过关于拓展中国剩余定理的博客...不过那时对其理解还不是比较深刻,写的也比较乱. 于是趁学校复习之机,再来重温一下拓展中国剩余定理(以下简称ExCRT) 记得半年 ...
- 2019牛客暑期多校训练营(第十场) Han Xin and His Troop (高精度+拓展中国剩余定理)
题意 裸题 思路 题中的模数之间并不互质,所以应该用拓展中国剩余定理. 但是交上去会炸,__int128过不了,所以用高精度的板子或者java大数都挺好过的. 这里推荐java大数,因为高精度板子用起 ...
- POJ-2891 Strange Way to Express Integers(拓展中国剩余定理)
放一个写的不错的博客:https://www.cnblogs.com/zwfymqz/p/8425731.html POJ好像不能用__int128. #include <iostream> ...
- 中国剩余定理及其拓展 CRT&EXGCD
中国剩余定理,又叫孙子定理. 作为一个梗广为流传.其实它的学名叫中国单身狗定理. 中国剩余定理 中国剩余定理是来干什么用的呢? 其实就是用来解同余方程组的.那么什么又是同余方程组呢. 顾名思义就是n个 ...
- 中国剩余定理(CRT)及其拓展(ExCRT)
中国剩余定理 CRT 推导 给定\(n\)个同余方程 \[ \left\{ \begin{aligned} x &\equiv a_1 \pmod{m_1} \\ x &\equiv ...
- 学习笔记:中国剩余定理(CRT)
引入 常想起在空间里见过的一些智力题,这个题你见过吗: 一堆苹果,\(3\)个\(3\)个地取剩\(1\)个,\(5\)个\(5\)个地取剩\(1\)个,\(7\)个\(7\)个地取剩\(2\)个,苹 ...
随机推荐
- WIN7+Qt5.2.0连接oracle数据库的oci驱动的编译
一.前提安装 1.需要安装QT5.2.0,本介绍安装的是qt-windows-opensource-5.2.0-mingw48_opengl-x86-offline.exe: 本文安装目录:c:\Qt ...
- udp如何实现可靠性传输?
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1udp与tcp的区别 TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的 ...
- JavaWeb——Get、Post请求中文乱码问题
最近在重温JavaWeb基础内容,碰到了之前也时常遇到的中文乱码问题,想着反正是经常要处理的,不如当即就把它整理出来放在博客里,省得遇到时再去到处搜. 1. Post请求乱码的解决方案: 手工创建一个 ...
- linux内核中rtc框架选用什么接口来注册rtc设备呢?
1. 有哪些接口? 1.1 devm_rtc_device_register 1.2 devm_rtc_allocate_device和 rtc_register_device 2. 1.1与1.2 ...
- Android 屏幕适配之dimens适配
Android 屏幕适配之dimens适配 转 https://blog.csdn.net/github_2011/article/details/72636851 在过去多个项目中一直使用 ...
- Docker 官方安装详解
# 0x00 安装热身 - 针对CE版本 Docker 分为 CE 和 EE 版本, CE免费,EE收费,CE版以及能够满足我们所有需求 本文针对 CE 版本的安装进行说明 - 系统说明 本文以 Ce ...
- python 内置数据结构 切片
切片 通过索引区间访问线性结构的一段数据 sequence[start:stop] 表示返回[start,stop]区间的子序列 支持负索引 start为0,可以省略 stop为末尾,可以省略 超过上 ...
- ubuntu kylin 18.04安装docker笔记
删除原有的docker应用(如果有的话): sudo apt-get remove docker docker-engine docker.io 更新一下: sudo apt-get update 下 ...
- 一个小故事,玩转Python-while循环
无论是传统编程场景还是当下火爆的人工智能应用场景,循环的应用都是必不可少的,上一篇文章中阐述了如何使用for循环来进行编程,这篇文章将会由一个小朋友经常听的故事来讲Python编程中的while循环. ...
- CG标准函数