普通的扩展欧几里得算法,通过了洛谷的扩展欧几里得算法找乘法逆元。修复了容易溢出的bug,虽然新版本仍有可能会溢出longlong,假如参与运算的数字都是longlong,假如可以的话直接使用__int128或者去抄一个RoundGod的BigInt的模板(这里的C题)。事不宜迟明天就抄这个大数模板。

求解模n意义下a的逆元,即求方程LCE2(a,1,n,x),结果放入x中,返回值指示是否有解。

ll gcd(ll a, ll b) {
if(b == 0)
return a;
while(ll t = a % b)
a = b, b = t;
return b;
} ll ex_gcd(ll a, ll b, ll& x, ll& y) {
if(b == 0) {
x = 1, y = 0;
return a;
}
ll d = ex_gcd(b, a % b, x, y), t;
t = x, x = y, y = t - a / b * y;
return d;
} //解线性同余方程 ax + by = c ,无解返回false
bool LCE1(ll a, ll b, ll c, ll &x0, ll &y0) {
ll x, y, d = ex_gcd(a, b, x, y);
if(c % d)
return false;
ll k = b / gcd(a, b);
x0 = ((x % k) * (c / d % k) % k + k) % k;
y0 = (c - a * x0) / b;
//x0是x的最小非负整数解
//x=x0+b*t,y=y0-a*t,是方程的所有解,对所有整数t成立
return true;
} //解线性同余方程 ax = b mod n ,无解返回false
//和方程 ax + ny = b 等价
bool LCE2(ll a, ll b, ll n, ll &x0) {
ll x, y;
if(LCE1(a, n, b, x, y)) {
ll k = n / gcd(a, n);
x0 = (x % k + k) % k;
//x0是最小非负整数解
//x=x0+k*t,是方程的所有解,对所有整数t成立
return true;
} else
return false;
}

未修复的版本理论上会快一点常数,没必要。但是还是做个提醒:

//解线性同余方程 ax + by = c ,无解返回false
bool LCE1(ll a, ll b, ll c, ll &x0, ll &y0) {
ll x, y, d = ex_gcd(a, b, x, y);
if(c % d)
return false;
ll k = c / d;
x0 = x * k;
y0 = y * k;
//x=x0+b*t,y=y0-a*t,是方程的所有解,对所有整数t成立
return true;
}

模板 - 数学 - 同余 - 扩展Euclid算法的更多相关文章

  1. 略学扩展Eculid算法

    扩展 Euclid 算法 Euclid 算法 辗转相除法 计算两个数最大公因数 \(\text{gcd}(a,\,b) = \text{gcd}(b,\,a\%b)\) exEuclid 算法 裴蜀定 ...

  2. 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

    题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...

  3. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  4. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  5. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  6. poj2142-The Balance(扩展欧几里德算法)

    一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...

  7. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

  8. poj1061-青蛙的约会(扩展欧几里德算法)

    一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...

  9. 最大公约数与欧几里得(Euclid)算法

    ---恢复内容开始--- 记a, b的最大公约数为gcd(a, b).显然, gcd(a,b)=gcd(|a|,|b|). 计算最大公约数的Euclid算法基于下面定理: [GCD递归定理]对于任意非 ...

随机推荐

  1. JSON C# Class Generator

    http://www.xamasoft.com/json-class-generator/ JsonHelper.cs using System; using System.Collections.G ...

  2. H5调起IOS原生商店支付

    参考文档:http://www.html5plus.org/doc/zh_cn/payment.html 申请内购项目摘自 https://www.jianshu.com/p/1e79bfbe46e2 ...

  3. DDL 操作数据库

    DDL 操作数据库:常用的操作 CRUD 一.C(create)创建 1.创建数据库 create database 数据库名称; 2.创建数据库,判断是否存在,再创建(如果存在,就不再创建) cre ...

  4. 常见SVN图标的含义

    转自:https://www.cnblogs.com/genhaosan/articles/5129791.html 灰色向右箭头:本地修改过 蓝色向左箭头:SVN上修改过 灰色向右且中间有个加号的箭 ...

  5. flask-sqlalchemy用法详解

    一. 安装 $ pip install flask-sqlalchemy 二. 配置 配置选项列表 : 选项 说明 SQLALCHEMY_DATABASE_URI 用于连接的数据库 URI .例如:s ...

  6. c# DirectoryInfo类

  7. 【转】VC和VS的区别

    各个版本之间的对应关系 使用windows平台搞开发时,下载第三方库时经常会遇到文件名以VCxx版本号命令,VC版本如何转换成对应的VS的版本呢,这里总结一下vc和vs的关系. Microsoft V ...

  8. WebService知识点

    Web Services简介: 什么是Web Services? Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self ...

  9. 矩阵迹 tr(AB)=tr(BA)的证明

    其实更为直观的理解是:AB与BA具有相同的对角线元素,因此tr(AB)=tr(BA)必然成立 ref:https://blog.csdn.net/silence1214/article/details ...

  10. SpringBoot RabbitMQ 延迟队列代码实现

    场景 用户下单后,如果30min未支付,则删除该订单,这时候就要可以用延迟队列 准备 利用rabbitmq_delayed_message_exchange插件: 首先下载该插件:https://ww ...