更新了\(Ex-CRT\)的内容


线性同余方程

定义

给定整数\(a,b,m\),对于形如\(ax\equiv b(mod\ m)\)的同余方程我们称之为一次同余方程,即线性同余方程。

解线性同余方程

对于此类方程,我们可以用如下方法快速的求解。

\[ ax\equiv b(mod\ m)⇔m|ax-b \]
不妨设\(-ym=ax-b\),则可以将方程改写为\(ax+my=b\),该不定方程可以使用扩展欧几里得算法快速地求解(详见『扩展欧几里得算法 Extended Euclid』)。

对于\(gcd(a,m)\not |b\)的情况,也可以直接判定为原方程无解。

对于使用扩展欧几里得算法求解出来的一个解\(x_0\),所有模\(\frac{m}{gcd(a,m)}\)意义下与\(x_0\)同余的整数都是方程的解,这是可以由不定方程的通解公式得到的。通常来说,我们需要求解最小非负整数解时,可以使用取模操作让\(x\)落在\(0\)到\(\frac{m}{gcd(a,m)}-1\)的范围内,就得到了最小解。

同余方程(NOIP2012)

Description

求关于 x 的同余方程 ax≡1(mod b) 的最小正整数解。

Input Format

输入只有一行,包含两个正整数 a,b,用一个空格隔开。

Output Format

输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

Sample Input

3 10

Sample Output

7

解析

模板题,将方程化为\(ax+by=1\),用扩展欧几里得算法求解。由于数据保证\(b\geq2\),所以不存在\(x=0\)的解,利用取模操作就能保证得到的解是最小整数解。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
inline long long Exeuclid(long long a,long long &x,long long b,long long &y,long long c)
{if (b==0){x=c/a,y=0;return a;}else {long long p=Exeuclid(b,x,a%b,y,c);long long x_=x,y_=y;x=y_;y=x_-a/b*y_;return p;}
}
long long A,B,X,Y;
int main(void)
{scanf("%lld%lld",&A,&B);long long p=Exeuclid(A,X,B,Y,1);printf("%lld\n",(X%(B/p)+(B/p))%(B/p));return 0;
}

中国剩余定理

描述

对于形如

\[ \begin{cases} x \equiv a_1(mod\ m_1) \\ x \equiv a_2(mod\ m_2) \\ \ \ \ \ \ \ \ \ \ \ \ ... \\ x \equiv a_n(mod\ m_n) \end{cases} \]

\(n\)个线性同余方程组成的线性同余方程组,如果有模数\(m_1,m_2,...,m_n\)两两互质,则方程组一定有解,解为\(x=\sum_{i=1}^{n}a_iM_it_i\)。

其中,\(m=\prod_{i=1}^nm_i\),\(M_i=\frac{m}{m_i}\),\(t_i\)为线性同余方程\(M_it_i \equiv 1(mod\ m_i)\)的一个解。

证明:
由于\(t_i\)为线性同余方程\(M_it_i \equiv 1(mod\ m_i)\)的一个解,所以对于\(\forall \ i,a_iM_it_i \equiv a_i(mod\ m_i)\)成立,又因为\(M_i\)是除了\(m_i\)以外所有模数的倍数,即对于\(\forall \ k\not =i,a_iM_it_i \equiv 0(mod\ m_k)\),所以解\(x=\sum_{i=1}^{n}a_iM_it_i\)对方程\(x \equiv a_i(mod\ m_i)\)也成立,故该解对于每一个方程都成立。

对于该同余方程组,其通解可以表示为\(x+km(k\in Z)\),对于最小非负整数解,也是通过取模\(m\)的操作就可以了。

曹冲养猪

Description

自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。

举个例子,假如有16头母猪,如果建了3个猪圈,剩下1头猪就没有地方安家了。如果建造了5个猪圈,但是仍然有1头猪没有地方去,然后如果建造了7个猪圈,还有2头没有地方去。

你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?

Input Format

第一行包含一个整数n (n <= 10) – 建立猪圈的次数,

解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示建立了ai个猪圈,有bi头猪没有去处。你可以假定ai,aj互质.

Output Format

输出包含一个正整数,即为曹冲至少养母猪的数目。

Sample Input

3
3 1
5 1
7 2

Sample Output

16

解析

中国剩余定理模板题,我们直接利用\(Exeuclid\)算法和线性同余方程的知识,解出\(t_i\),然后构造最小非负整数解即可。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
#define mset(name,val) memset(name,val,sizeof name)
const int N=12;
long long a[N],m[N],M[N],t[N],n,m_,ans;
inline void input(void)
{scanf("%lld",&n);for (int i=1;i<=n;i++)scanf("%lld%lld",&m[i],&a[i]);
}
inline long long Exeuclid(long long a,long long &x,long long b,long long &y,long long c)
{if (b==0){x=c/a,y=0;return a;}else{long long p=Exeuclid(b,x,a%b,y,c);long long x_=x,y_=y;x=y_;y=x_-a/b*y_;return p;}
}
inline void china(void)
{m_=1;for (int i=1;i<=n;i++)m_*=m[i];for (int i=1;i<=n;i++)M[i]=m_/m[i];for (int i=1;i<=n;i++){long long y;Exeuclid(M[i],t[i],m[i],y,1);ans += a[i]%m_ * M[i]%m_ * t[i]%m_;ans %= m_;}
}
int main(void)
{input();china();printf("%lld\n",(ans%m_+m_)%m_);return 0;
}

拓展中国剩余定理

对于形如

\[ \begin{cases} x \equiv a_1(mod\ m_1) \\ x \equiv a_2(mod\ m_2) \\ \ \ \ \ \ \ \ \ \ \ \ ... \\ x \equiv a_n(mod\ m_n) \end{cases} \]
这样的方程组,如果模数\(m\)两两互质,那么我们可以直接利用中国剩余定理构造出解。但是对于模数\(m\)不互质的情况,我们其实也可以利用类似的方法求解。

我们考虑用数学归纳法的过程构造解。对于前\(k-1\)个方程,假设已经有一个合法的解\(x\),那么我们利用如下的方法得到满足前\(k\)个方程的解:

记\(m=lcm(m_1,m_2,...,m_{k-1})\),显然,对于\(\forall \ p\in Z,x+pm\)都是前\(k-1\)个方程的解。
那么我们找一个\(p=t\),使得\(x+pm\equiv a_k(mod\ m_k)\)就是前\(k\)个方程的解了。这个就是扩展欧几里得算法的事了嘛。
\(x+pm\equiv a_k(mod\ m_k)⇔pm\equiv a_k-x(mod\ m_k)\),扩展欧几里得解一下,如果无解,则原方程组无解。

当然,求解最小整数解还是取模就行了。

\(Code:\)

inline long long ExCRT(void)
{long long m_=m[1],x=r[1];for (int i=2;i<=n;i++){long long x_,y_;if ( (r[i]-x) % gcd(m_,m[i]) )return -1;long long p=Exeuclid(m_,x_,m[i],y_,r[i]-x);long long Mod=m[i]/p;//要对当前的解先取模,防止爆longlongx_ = (x_%Mod+Mod)%Mod;x += x_ * m_;m_ = m_*m[i]/p;x = (x+m_)%m_;}return x;
}

转载于:https://www.cnblogs.com/Parsnip/p/10685817.html

『线性同余方程和中国剩余定理』相关推荐

  1. 线性同余方程和中国剩余定理学习笔记

    线性同余方程介绍 形如 a x ≡ c ( m o d b ) ax \equiv c \pmod b ax≡c(modb) 的方程被称为 线性同余方程(Congruence Equation). 求 ...

  2. 同余2:线性逆元和中国剩余定理的学习笔记

    同余2:逆元和中国剩余定理的学习笔记 逆元 中国剩余定理 扩展中国剩余定理 前言 上一次,我讲到了求解线性同余方程,并挖了一个线性求逆元的大坑,现在补上吧. 逆元 逆元的定义:若 a ∗ x ≡ 1 ...

  3. 【数论】同余(四):一元线性同余方程组(两两相消、中国剩余定理)

    同余问题共7part,我的博客链接: 基本概念与性质 逆元:概念.求解方法与推导 线性同余方程 一元线性同余方程 一元线性同余方程组 多元线性同余方程 高次同余方程:BSGS算法(大小步算法.拔山盖世 ...

  4. 中国剩余定理与线性同余方程组求解

    中国剩余定理与线性同余方程组求解 线性同余方程组的形式 中国剩余定理 线性同余方程组的形式 实际上一元一次线性同余方程组,形式如下: { x ≡ r 0 ( m o d m 0 ) x ≡ r 1 ( ...

  5. 第二十九章 数论——中国剩余定理与线性同余方程组

    第二十九章 数论--中国剩余定理与线性同余方程组 一.中国剩余定理 1.作用: 2.内容: 3.证明: (1)逆元的存在性 (2)验证定理的正确性 4.代码实现: (1)步骤: (2)问题: (3)代 ...

  6. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

  7. 数论 —— 线性同余方程组与中国剩余定理

    [线性同余方程组] 由若干个线性同余方程构成的线性方程组. 例如: 其解法最早由我国<孙子算经>给出,因此解法称为"孙子定理",又叫"中国剩余定理" ...

  8. [中国剩余定理]【学习笔记】

    求解同余方程请看 http://www.cnblogs.com/candy99/p/5765986.html [2017-02-14 19:05] [2017-03-23 update]:看组合数学的 ...

  9. 中国剩余定理(c语言)

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

最新文章

  1. c#操作Excel整理总结
  2. webhook php自动部署,git利用webhook实现自动部署​
  3. 【python初识】列表与函数模块
  4. 接口请求时params与data的区别
  5. 纯C++版的Faster-Rcnn(通过caffe自定义RPN层实现)
  6. 线程对象Android 开发之多线程处理、Handler 详解
  7. 微型计算机系统包括( )几部分,微型计算机系统包括哪几个部分?
  8. win10系统的服务器在哪里设置密码,window10怎么设置密码
  9. 在linux上面找一个脚本,30个Linux Shell脚本经典案例
  10. 有关CNN网络结构的总结
  11. 数据结构与算法python—10.二叉树题目leetcode总结
  12. python还能活多久_啥?python以后没活路?
  13. 网页设计制作CSS实现隔行换色两种方法
  14. 中国指数基金与ETF价格战简史(1)
  15. 计算机控制系统电梯控制,计算机控制系统实验报告1.doc
  16. 武汉工程大学计算机学院吴云韬,周华兵-武汉工程大学计算机科学与工程学院...
  17. 删除磁盘分区 删除OEM分区
  18. 【汇编程序】从键盘上输入一系列以‘$’为结束符的字符串,然后对其中的字母字符计数,并显示出计数结果
  19. 计算机进制试题,计算机各种进制转换练习题(附答案)
  20. autojs 手游 脚本UI demo【仅供学习交流】

热门文章

  1. laravel route函数 404_laravel生成及获取不同类型的URL地址总结
  2. php5.2 array,详解php 5.2.x 数组操作实例
  3. mysql用any查询_mysql 5.6有ANY_VALUE功能吗?
  4. Linux系统--CentOS 7.6.1810 安装 fping 3.15
  5. SPOJ - SUBLEX 【后缀自动机】
  6. 2017-03-01 Oracle10g的安装与配置使用
  7. 识别浏览器的JavaScript引擎的方法
  8. HTML5css3学习总结(2)
  9. 根据中文修改英文翻译,重新生成英文翻译文件(保证原有文件的顺序不变)
  10. leetcodeT14-最长公共前缀(两种解法+图解)