扩展欧几里得(ex_gcd),中国剩余定理(CRT)讲解 有代码
扩展欧几里得算法
求逆元就不说了。
ax+by=c
这个怎么求,很好推。
设d=gcd(a,b) 满足d|c方程有解,否则无解。
扩展欧几里得求出来的解是 x是 ax+by=gcd(a,b)的解。
对于c的话只需要x*c/gcd(a,b)%(b/d)即可,因为b/d的剩余系更小。
为什么这样呢?
设a'=a/d,b'=b/d 求出a'x+b'y=1的解,两边同时乘d,然后x也是ax+by=d的解,
然后因为b'的剩余系更小,所以%b’
中国剩余定理是合并线性方程组的
中国余数定理
转化为一个线性方程 ax+by=c
a,b
c,d
num % a=b;
num % c=d;
求num最小正整数解;
num=ax+b=cy+d
ax-cy=d-b
可以化为求解 ax≡(d-b)(mod c);
ax+cy=d-b
用ex_gcd求解出x;
num=a*x+b;
这样num mod a=b
num mod c=d-b+b=d
因为x为最小正整数解,所以num为最小解
满足的集合为{x|x=num+k·[a,b],(k∈Z)}
然后转化为%lcm(a,c)=num
然后继续合并
附上代码,完美代码
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
typedef long long ll;
using namespace std;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if (!b)
{
x=,y=;
return a;
}
ll fzy=ex_gcd(b,a%b,x,y);
ll t=x;
x=y;y=t-a/b*y;
return fzy;
}
int main()
{
int t;
ll z1,z2,z3,z4;
while (cin>>t)
{
bool flag=;
scanf("%lld%lld",&z1,&z2);
for (int i=;i<t;i++)
{
scanf("%lld%lld",&z3,&z4);
if (flag) continue;
ll a=z1,b=z3,c=z4-z2;
ll x,y;
ll d=ex_gcd(a,b,x,y);
if (c%d!=)
{
flag=;
continue;
}
ll t=b/d;
x=(x*(c/d)%t+t)%t;//t的剩余系更小。
z2=z1*x+z2;//得出num
z1=z1*(z3/d);
cout<<"z1="<<z1<<" z2="<<z2<<endl;
}
if (flag==) cout<<-<<endl;
else cout<<z2<<endl;
}
}
扩展欧几里得(ex_gcd),中国剩余定理(CRT)讲解 有代码的更多相关文章
- hdu1573-X问题-(扩展欧几里得定理+中国剩余定理)
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu3579-Hello Kiki-(扩展欧几里得定理+中国剩余定理)
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ2115 - C Looooops(扩展欧几里得)
题目大意 求同余方程Cx≡B-A(2^k)的最小正整数解 题解 可以转化为Cx-(2^k)y=B-A,然后用扩展欧几里得解出即可... 代码: #include <iostream> us ...
- poj2115 C Looooops——扩展欧几里得
题目:http://poj.org/problem?id=2115 就是扩展欧几里得呗: 然而忘记除公约数... 代码如下: #include<iostream> #include< ...
- 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍
1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...
- poj 2891 扩展欧几里得迭代解同余方程组
Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...
- gcd,扩展欧几里得,中国剩余定理
1.gcd: int gcd(int a,int b){ ?a:gcd(b,a%b); } 2.中国剩余定理: 题目:学生A依次给n个整数a[],学生B相应给n个正整数m[]且两两互素,老师提出问题: ...
- C Looooops(扩展欧几里得+模线性方程)
http://poj.org/problem?id=2115 题意:给出A,B,C和k(k表示变量是在k位机下的无符号整数),判断循环次数,不能终止输出"FOREVER". 即转化 ...
- 中国剩余定理(CRT)及其扩展(EXCRT)详解
问题背景 孙子定理是中国古代求解一次同余式方程组的方法.是数论中一个重要定理.又称中国余数定理.一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作<孙子算经>卷下第 ...
随机推荐
- sqlite的sql常用语句(笔记)
1.复制一张表并重命名 比如已经创建好一个表 表名为"28165" 复制这个表. CREATE TABLE [33150] AS SELECT * FROM [28165] 2.根 ...
- 《Linux就该这么学》,刘小伙实在人,给打个广告
本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...
- 给树莓派Raspbian stretch版本修改软件源
树莓派最新的系统版本是stretch,试了阿里和网易的软件源都不行,最后试了清华的可以 deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbia ...
- 【转载】谈MongoDB的应用场景
引用:http://blog.csdn.net/adparking/article/details/38727911 MongoDB的应用场景在网上搜索了下,很少介绍关于传统的信息化应用中如何使用Mo ...
- Android 拍照或相册选择照片进行显示缩放位图 Demo
拍照后直接使用 BitmapFactory.decodeStream(...) 进行创建 Bitmap 并显示是有问题的. Bitmap 是个简单对象,它只存储实际像素数据,也就是说,即使原始照片已压 ...
- 在MAC下使用Robotframework+Selenium2【第二枪】如何处理Table点击指定记录
1.通过关键字Get Matching Xpath Count获取table中的记录 2.遍历Table所有记录 3.判断记录是否符合条件,做点击操作
- 9.3centos7安装python3 以及tab补全功能
1.安装python3 1.1下载python源码包 网址:https://www.python.org/downloads/release/python-362/ 下载地址:https://www. ...
- NPM安装vue-cli,并创建vue+webpack项目模板
1.安装npm npm 是node.js 的包管理工具, 安装流程地址:https://docs.npmjs.com/cli/install 估计会非常慢,我们可以使用淘宝NPM镜像下载安装:htt ...
- CodeForces 785C Anton and Fairy Tale 二分
题意: 有一个谷仓容量为\(n\),谷仓第一天是满的,然后每天都发生这两件事: 往谷仓中放\(m\)个谷子,多出来的忽略掉 第\(i\)天来\(i\)只麻雀,吃掉\(i\)个谷子 求多少天后谷仓会空 ...
- laravel - ReflectionException in Container.php, Class not found?
SIGN UPSIGN IN CATALOG SERIES PODCAST DISCUSSIONS ReflectionException in Container.php, Class not fo ...