扩展欧几里得算法

  求逆元就不说了。

  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)讲解 有代码的更多相关文章

  1. hdu1573-X问题-(扩展欧几里得定理+中国剩余定理)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. hdu3579-Hello Kiki-(扩展欧几里得定理+中国剩余定理)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. POJ2115 - C Looooops(扩展欧几里得)

    题目大意 求同余方程Cx≡B-A(2^k)的最小正整数解 题解 可以转化为Cx-(2^k)y=B-A,然后用扩展欧几里得解出即可... 代码: #include <iostream> us ...

  4. poj2115 C Looooops——扩展欧几里得

    题目:http://poj.org/problem?id=2115 就是扩展欧几里得呗: 然而忘记除公约数... 代码如下: #include<iostream> #include< ...

  5. 欧几里得(辗转相除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* ...

  6. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

  7. gcd,扩展欧几里得,中国剩余定理

    1.gcd: int gcd(int a,int b){ ?a:gcd(b,a%b); } 2.中国剩余定理: 题目:学生A依次给n个整数a[],学生B相应给n个正整数m[]且两两互素,老师提出问题: ...

  8. C Looooops(扩展欧几里得+模线性方程)

    http://poj.org/problem?id=2115 题意:给出A,B,C和k(k表示变量是在k位机下的无符号整数),判断循环次数,不能终止输出"FOREVER". 即转化 ...

  9. 中国剩余定理(CRT)及其扩展(EXCRT)详解

    问题背景   孙子定理是中国古代求解一次同余式方程组的方法.是数论中一个重要定理.又称中国余数定理.一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作<孙子算经>卷下第 ...

随机推荐

  1. sqlite的sql常用语句(笔记)

    1.复制一张表并重命名 比如已经创建好一个表 表名为"28165" 复制这个表. CREATE TABLE [33150] AS SELECT * FROM [28165] 2.根 ...

  2. 《Linux就该这么学》,刘小伙实在人,给打个广告

    本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...

  3. 给树莓派Raspbian stretch版本修改软件源

    树莓派最新的系统版本是stretch,试了阿里和网易的软件源都不行,最后试了清华的可以 deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbia ...

  4. 【转载】谈MongoDB的应用场景

    引用:http://blog.csdn.net/adparking/article/details/38727911 MongoDB的应用场景在网上搜索了下,很少介绍关于传统的信息化应用中如何使用Mo ...

  5. Android 拍照或相册选择照片进行显示缩放位图 Demo

    拍照后直接使用 BitmapFactory.decodeStream(...) 进行创建 Bitmap 并显示是有问题的. Bitmap 是个简单对象,它只存储实际像素数据,也就是说,即使原始照片已压 ...

  6. 在MAC下使用Robotframework+Selenium2【第二枪】如何处理Table点击指定记录

    1.通过关键字Get Matching Xpath Count获取table中的记录 2.遍历Table所有记录 3.判断记录是否符合条件,做点击操作

  7. 9.3centos7安装python3 以及tab补全功能

    1.安装python3 1.1下载python源码包 网址:https://www.python.org/downloads/release/python-362/ 下载地址:https://www. ...

  8. NPM安装vue-cli,并创建vue+webpack项目模板

    1.安装npm npm 是node.js 的包管理工具, 安装流程地址:https://docs.npmjs.com/cli/install  估计会非常慢,我们可以使用淘宝NPM镜像下载安装:htt ...

  9. CodeForces 785C Anton and Fairy Tale 二分

    题意: 有一个谷仓容量为\(n\),谷仓第一天是满的,然后每天都发生这两件事: 往谷仓中放\(m\)个谷子,多出来的忽略掉 第\(i\)天来\(i\)只麻雀,吃掉\(i\)个谷子 求多少天后谷仓会空 ...

  10. laravel - ReflectionException in Container.php, Class not found?

    SIGN UPSIGN IN CATALOG SERIES PODCAST DISCUSSIONS ReflectionException in Container.php, Class not fo ...