扩展中国剩余定理学习笔记+模板(洛谷P4777)
题目链接:
题目大意:求同余方程组
$x\equiv b_i(mod\ a_i)$
的最小正整数解。
$1\leq n\leq 10^5,1\leq a_i\leq 10^{12},0\leq b_i\leq 10^{12},b_i<a_i$,保证有解,答案不超过 $10^{18}$。
(其实我没打成方程组形式是因为我 $latex$ 太差)
既然是模板就直接讲方法。假设不一定有解。
方法:每次将前 $i-1$ 个方程合并后的方程与第 $i$ 个方程合并,直到 $n$ 个方程全部合并完。
(合并之后的方程也是 $x\equiv B(mod\ A)$ 的形式)
来看看假设前 $i-1$ 个方程合并后是 $x\equiv B(mod\ A)$,第 $i$ 个方程是 $x\equiv b_i(mod\ a_i)$。
那么合并后的新方程模数肯定是 $\operatorname{lcm}(A,a_i)$。
发现 $x$ 可以表示成 $kA+B$ 的形式,我们就是要找到一个 $k'$ 使得 $k'A+B\equiv b_i(mod\ a_i)$,也就是 $k'A\equiv b_i-B(mod\ a_i)$。
其中 $A,b_i-B,a_i$ 都是已知的,这不就 $EXGCD$ 的模板了吗!
好的。求出 $k'$ 合并之后就是 $x\equiv k'A+B(mod\ \operatorname{lcm}(A,a_i))$。如果方程无解(即没有符合条件的 $k'$)那么整个方程组无解。
一路滚下去,最后滚出的 $B$ 就是答案。
时间复杂度:$n$ 次合并,每次一个 $EXGCD$,复杂度 $O(n\log(\max\{a_i\}))$。
代码:(附带判断)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll a[],b[];
ll qmul(ll a,ll b,ll mod){ //模数是long long范围,要写慢速乘
ll ans=;
for(;b;b>>=,a=(a<<)%mod) if(b&) ans=(ans+a)%mod;
return ans;
}
ll exgcd(ll a,ll b,ll &x,ll &y){ //模板(返回gcd(a,b))
if(!b){x=;y=;return a;}
ll d=exgcd(b,a%b,y,x);y-=a/b*x;return d;
}
ll excrt(){ //模板
ll clcm=a[],ans=b[]; //前一个方程合并就是第一个方程(clcm是A,ans是B)
for(int i=;i<=n;i++){
ll x,y,d=exgcd(clcm,a[i],x,y),r=((b[i]-ans)%a[i]+a[i])%a[i],tmp=clcm/d*a[i]; //x,y,d是EXGCD中的,r是bi-B,tmp是lcm(A,ai)
if(r%d) return -; //裴蜀定理,不整除gcd则无解
x=(qmul(x,r/d,a[i])+a[i])%a[i]; //真正的k'
ans=(ans+qmul(x,clcm,tmp))%tmp; //新的B
clcm=tmp; //新的A
}
return ans; //滚出来的B
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lld%lld",a+i,b+i);
printf("%lld\n",excrt());
}
EXCRT
其实我学这个是为了做出这题:
洛谷P4774 BZOJ5418 LOJ2721 [NOI2018]屠龙勇士 题解
扩展中国剩余定理学习笔记+模板(洛谷P4777)的更多相关文章
- 2-SAT问题学习笔记+例题[洛谷P4792]
一个不错的2-SAT文章:传送门 问题初入 什么是2-SAT SAT是适定性(Satisfiability)问题的简称 .一般形式为k-适定性问题,简称 k-SAT. 首先,把「2」和「SAT」拆开. ...
- 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
- 扩展中国剩余定理(EXCRT)学习笔记
扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...
- (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)
前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...
- [Luogu P4777] 【模板】扩展中国剩余定理(EXCRT) (扩展中国剩余定理)
题面 传送门:洛咕 Solution 真*扩展中国剩余定理模板题.我怎么老是在做模板题啊 但是这题与之前不同的是不得不写龟速乘了. 还有两个重点 我们在求LCM的时候,记得先/gcd再去乘另外那个数, ...
- P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers
P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...
- P4777 【模板】扩展中国剩余定理(EXCRT)&& EXCRT
EXCRT 不保证模数互质 \[\begin{cases} x \equiv b_1\ ({\rm mod}\ a_1) \\ x\equiv b_2\ ({\rm mod}\ a_2) \\ ... ...
- P4777 【模板】扩展中国剩余定理(EXCRT)
思路 中国剩余定理解决的是这样的问题 求x满足 \[ \begin{matrix}x \equiv a_1(mod\ m_1)\\x\equiv a_2(mod\ m_2)\\ \dots\\x\eq ...
随机推荐
- CISCN 应用环境相关指令备忘录
1 - 关于Python环境的 使用Anaconda2管理Python环境 1.1 - 安装 官网下载安装包下载. 1.2 - 创建Python环境 localhost:template mac$ c ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- C#基础之.NET环境下WebConfig的加密
在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...
- 阿里云代金券 - 双12疯了~~~ 4核8G 3M带宽只要1890元/3年
阿里云双12大促简直疯了,4核8G 3M带宽只要1890元/3年,比双11疯狂多了,双11没有上车的赶快来买吧!!! 前去阿里云双12活动页面 截图如下: 从截图中可以看出,不仅4核8G降到了地板,1 ...
- python3 简单进度条代码
进度条代码函数实现 import sys, time class ShowProcess(object): """ 显示处理进度的类 调用该类相关函数即可实现处理进度的显 ...
- 初级字典树查找在 Emoji、关键字检索上的运用 Part-2
系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 在有了 Unicode 和 Emoji 的知识准备后,本文进入编码环节. 我们知道 Emoji 是 Unico ...
- 记录:TensorFlow 中的 padding 方式
TensorFlow 中卷积操作和池化操作中都有一个参数 padding,其可选值有 ['VALID', 'SAME']. 在 TensorFlow 文档中只是给出了输出张量的维度计算方式,但是并没有 ...
- svn commit时报错 File already exists
第一步: 删除当前文件所在文件夹,提交commit 第二步: 新建刚才删除的文件夹,并将先前需要commit的文件放到此文件夹下,再次commit 提交
- Tortoisegit生成SSH密钥一次性输入密码
一.找到Tortoisegit 的安装目录,进入bin目录下,找到puttygen.exe并打开,点击Generate按钮,会看到上面出现绿色滚动条,此时要不停移动鼠标,进度会比较快,完成后,就会看到 ...
- 501. Find Mode in Binary Search Tree【LeetCode by java】
Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...