一、求解模线性方程

由ax=b(mod n)

可知ax = ny + b

就相当于ax + ny = b

由扩展欧几里得算法可知有解条件为gcd(a, n)整除d

可以直接套用扩展欧几里得算法

最终由d个不同解时在模n下有d个不同的数字

二、中国剩余定理

证明可看:https://www.cnblogs.com/MashiroSky/p/5918158.html

ll extgcd(ll a, ll b, ll& x, ll& y)
//求解ax+by=gcd(a, b)
//返回值为gcd(a, b)
{
ll d = a;
if(b)
{
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}
else x = , y = ;
return d;
}
ll solve(ll a[], ll m[], int n)//a数组是余数,m数组是两两互质的数字
{
ll M = , ans = ;
for(int i = ; i < n; i++)M *= m[i];
//cout<<M<<endl;
for(int i = ; i < n; i++)
{
ll mi = M / m[i], x, y;
extgcd(mi, m[i], x, y);
//求出mi模上m[i]的逆元x mi * x + m[i] * y = gcd(mi, m[i]) = 1(两两互质)
ans = ans + ((a[i] % M) * (mi % M) % M) * (x % M) % M;
ans = (ans % M + M) % M;
}
return ans;
}

三、中国剩余定理扩展---求解一般的模线性方程组

  普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?

  这种情况就采用两两合并的思想,假设要合并如下两个方程:

  那么得到:

  我们需要求出一个最小的xx使它满足:

在代码中,每次求出m0 * x + m[i] * y = a[i] - a0的解x的时候,对x模上m[i],这是为了保证x绝对值较小,防止之后的乘法溢出,

x的通解就是x + k * m[i] / gcd(m0, m[i]),此处模上m[i] / gcd(m0, m[i])更好

 ll extgcd(ll a, ll b, ll& x, ll& y)
//求解ax+by=gcd(a, b)
//返回值为gcd(a, b)
{
ll d = a;
if(b)
{
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}
else x = , y = ;
return d;
}
ll solve(ll a[], ll m[], int n)//a数组是余数,m数组是除数
{
ll m0 = m[], a0 = a[];
for(int i = ; i < n; i++)
{
ll x, y;
ll g = extgcd(m0, m[i], x, y);//求出m0 * x + m[i] * y = gcd(x, y)
if((a[i] - a0) % g)return -;
x = x * (a[i] - a0) / g % m[i];
//求出m0 * x + m[i] * y = a[i] - a0的解x
//此处模上m[i]是为了取绝对值最小的一个x,因为x的通解就是x+k*m[i]
ll K = x * m0 + a0; //代回原式,求出最大的K
m0 = m0 / g * m[i]; //m0更新为m0和m[i]的lcm
a0 = K; //a0更新为K
a0 = ((a0 % m0) + m0) % m0;
}
return a0;
}

模线性方程&&中国剩余定理及拓展的更多相关文章

  1. 中国剩余定理及其拓展 CRT&EXGCD

    中国剩余定理,又叫孙子定理. 作为一个梗广为流传.其实它的学名叫中国单身狗定理. 中国剩余定理 中国剩余定理是来干什么用的呢? 其实就是用来解同余方程组的.那么什么又是同余方程组呢. 顾名思义就是n个 ...

  2. BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)

    数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...

  3. E - Two Arithmetic Progressions(CodeForces - 710D)(拓展中国剩余定理)

    You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x such ...

  4. 礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)

    礼物 题意: 求\[C(n,m)\ \%\ p\] \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k ...

  5. 拓展中国剩余定理(exCRT)摘要

    清除一个误区 虽然中国剩余定理和拓展中国剩余定理只差两个字,但他俩的解法相差十万八千里,所以会不会CRT无所谓 用途 求类似$$\begin{cases}x \equiv b_{1}\pmod{a_{ ...

  6. 中国剩余定理(CRT)及其拓展(ExCRT)

    中国剩余定理 CRT 推导 给定\(n\)个同余方程 \[ \left\{ \begin{aligned} x &\equiv a_1 \pmod{m_1} \\ x &\equiv ...

  7. [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

    题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...

  8. 拓展中国剩余定理(ex_crt)

    一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...

  9. POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理)

    POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理) 题意分析 不妨设日期为x,根据题意可以列出日期上的方程: 化简可得: 根据中国剩余定理求解即可. 代码总览 #include & ...

随机推荐

  1. 网站ico那点事儿

    一. 如何获取某个网站的favicon.ico http://moco.imooc.com/player/report.html 今天看到这个网站上,左侧的小图片挺好看的,想弄下来,检查源码,也没有看 ...

  2. Android ContentProvider的介绍(很详细)

    博客分类: android进阶   一.ContentProvider的概念 ContentProvider:为存储和获取数据提供统一的接口.可以在不同的应用程序之间共享数据.Android已经为常见 ...

  3. C#下查找并杀死子进程(进程树)

    参考:如何杀死进程及子进程 /** * 传入参数:父进程id * 功能:根据父进程id,杀死与之相关的进程树 */ public static void KillProcessAndChildren( ...

  4. Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记

    8 Unsupervised Learning8.1 Clustering8.1.1 Unsupervised Learning: Introduction集群(聚类)的概念.什么是无监督学习:对于无 ...

  5. nyoj 61——传纸条(一)——————【双线dp】

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  6. [SDOI2013]刺客信条

    Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的天赋,成为了杰出的刺 ...

  7. bootstrap fileinput+MVC 上传多文件,保存

    新增用户资料,需要用户上传多笔附件,所以就尝试用了fileinput控件,显示效果如图: 首先,先在model中定义数据模型: public partial class create { [Requi ...

  8. View视图调用控制器方法

    1.@using XXX.Controllers;//引用控制器 2. var otherController = DependencyResolver.Current.GetService<U ...

  9. python的传递实参

    你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字.数字或更复杂的对象(如字典).将列表传递给函数后,函数就能直接访问其内容 1.在函数中修改列表 将列表传递给函数后,函数就可对其进行修改. ...

  10. .NET开源工作流RoadFlow-表单设计-附件管理

    在表单中添加一个附件管理的控件: 文件类型:指定可以上传的文件类型.