excrt
时间:2020-07-12
本文章向大家介绍excrt,主要包括excrt使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
求一个形如\(x\equiv a_i\ (mod\ \ p_i)\) 的线性方程组的解
我们考虑合并两个方程:
\[\begin{cases}
x=a_1\ (mod\ \ p_1)\\
\\
x=a_2\ (mod\ \ p_2)\\
\end{cases}
\]
先考虑将\(x\)设为\(a_1\),再不断的加\(p_1\)的倍数使得\(x\)在模\(p_2\)意义下为\(a_2\)
我们可以用exgcd求得一组\(mp_1+np_2= gcd(p_1,p_2)\)的解,即\(mp_1\equiv gcd(p1,p2)\ (mod\ \ p2)\)
也就是说我们每次增加\(mp_1\)即可让\(x\)在模\(p_1\)意义下增加\(gcd(p_1,p_2)\)
令\(d=gcd(p_1,p_2)\),那么我们应该增加\((a_2-a_1)/d\) 次,即\(x\)应该加上\((a_2-a_1)/d*mp_1\),然后我们知道方程合并后的模数应该是\(P=p_1*p_2/gcd(p_1,p_2)\),所以再将结果对\(P\)取模即可。
代码:
LL exgcd(LL x,LL y,LL&a,LL&b){
LL z;
return y?(z=exgcd(y,x%y,b,a),b-=x/y*a,z):(a=1,b=0,x);
}
LL mult(LL a,LL b,LL p){
LL ans=0;
while(b){
if(b&1)ans=(ans+a)%p;
b>>=1,a=(a<<1)%p;
}
return ans;
}
struct CRT{
LL a[N],p[N],P,x;
bool excrt(LL a1,LL p1,LL a2,LL p2){
LL m,n,d=exgcd(p1,p2,m,n); P=p1/d*p2;
LL a=(a2-a1%p2+p2)%p2;
if(a%d!=0)return false;
x=(x+mult(a/d*p1,m,P))%P; //注意这里一般先计算a/d*p1,然后再乘m,因为题目一般保证了所有p_i的最小公倍数小于某个值,这样前面的运算就不会溢出,而后面的乘m可能会溢出,所以还要用快速乘。
return true;
}
bool run(){
x=a[1],P=p[1];
for(int i=2;i<=n;i++)
if(!excrt(x,P,a[i],p[i]))
return false;
return true;
}
}crt;
原文地址:https://www.cnblogs.com/lishuyu2003/p/13287249.html
- HTML5 直播协议之 WebSocket 和 MSE
- IoC在ASP.NET Web API中的应用
- 跟鹅厂老司机学技术之一:“遇见” Kotlin
- 简单的 H5 视频推流解决方案
- 来腾讯云开发者实验室学习.NET
- 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
- 使用腾讯云 GPU 学习深度学习系列之六:物体的识别与定位
- npm5 新版功能特性解析及与 yarn 评测对比
- H5直播避坑指南
- 龙门阵之 DevOps 门外汉须知
- 全面进阶 H5 直播(上)
- 这年头,不会斗图都毕不了业?
- 龙妈也会死?《权力的游戏》 AI 算法预测丹妮女王危在旦夕
- 腾讯云 GAME-TECH 沙龙干货回顾:海外网络拓展及质量把控
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实验7 3D机器人
- EasyValidate优雅地校验提交数据完整性
- 实验8 OpenGL太阳系动画
- Django实现列表页商品数据返回教程
- 实验9 OpenGL光照
- Python实现多线程下载脚本的示例代码
- Android自定义控件仿iOS滑块SwitchButton
- kotlin gson反序列化默认值失效深入讲解
- Android使用Volley实现上传文件功能
- 工作中使用jasmine遇到的一个html element和Component绑定属性失去同步的问题
- Android使用Volley框架定制PostUploadRequest上传文件
- Android实现横向滑动卡片效果
- 在jasmine beforeEach里修改UI元素的一个side effect
- Android实现头像上传功能
- 关于jasmine里debugElement.query和fixture.detectChanges的依赖关系