扩展中国剩余定理学习笔记+模板(洛谷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 ...
随机推荐
- 同步IO和异步IO的区别
首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO.非阻塞IO.IO服用 ...
- Fiddler无法抓取某些APP的HTTPS请求,无解!!!
遇到有些APP的HTTPS请求无法抓取!错误提示: !SecureClientPipeDirect failed: System.Security.Authentication.Authenticat ...
- go语言之行--网络编程、http处理流程详情
一.简介 go语言中的网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP.TCP/IP.UDP.域名解析和Unix域socket等.和大多数语言一样go可以使用几行代码便可以启动 ...
- # 2017-2018-2 20155319《网络对抗技术》Exp9 :Web安全基础
2017-2018-2 20155319<网络对抗技术>Exp9 :Web安全基础 实践过程 webgoat准备 从GitHub上下载jar包(老师的虚拟机中有 无需下载) 拷贝到本地,并 ...
- 浅谈Spring中的事务回滚
使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控 ...
- WPF解决按钮上被透明控件遮盖时无法点击问题
原文:WPF解决按钮上被透明控件遮盖时无法点击问题 IsHitTestVisible="False" 在控件上设置如上属性即可,即可让透明控件不触发点击效果
- Redux系列x:源码解析
写在前面 redux的源码很简洁,除了applyMiddleware比较绕难以理解外,大部分还是 这里假设读者对redux有一定了解,就不科普redux的概念和API啥的啦,这部分建议直接看官方文档. ...
- bower配置私服nexus3
内容来自 https://help.sonatype.com/repomanager3/bower-repositories#BowerRepositories-BrowsingBowerReposi ...
- LeetCode 141. Linked List Cycle环形链表 (C++)
题目: Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked ...
- 《Linux内核分析》--扒开系统调用的三层皮 20135311傅冬菁
扒开系统调用的三层皮 20135311傅冬菁 一.内容分析 寄存器上下文(从用户态切换到内核态) 中断/int指令会在堆栈上保存一些寄存器的值(用户态栈顶地址..当时的状态字.当下 ...