前言

与 这个 定理 搏斗了 一天终于 把它kill 了 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

进入正题


题目描述

给定 n 组 非负整数 ai,bi,求解关于 x 的方程组

            x ≡ a1 (mod b1)

            x ≡ a2 (mod b2)

            .

            .

            x ≡ an (mod bn)

声明 : M 表示 前 i-1 个bi 的 最小公倍数(LCM), ans 表示 满足前 i-1 个方程的最小解

初始化: 特判 第一组方程 令 M = b1 , ans = a1(第一组的话 b1的最小公倍数就是自己,只看第一个方程 ans 就等于 a1)

从第二组开始:

        LCM(b1,b2) =  b1×b2 /(gcd(b1,b2))这个不需要证明

        因为 此时 M = b1 ,所以原式可化为:

                 LCM(M,b2) =  M×b2 /(gcd(M,b2))

考虑: ans + t×M 一定是 前 i-1 个方程 的通解,因为 ans 是 最小解 所以 ans 加上前 i-1 个方程 bi 的最小公倍数 一定是前 i-1 个方程 的通解。(其中 t ∈ Z)

所以 如果要使得 ans 也满足 下一个方程的话(以第二个 来举例):

    ans + t×M ≡ a2 (mod b2) 此时 ans 是a1 是已知的

移项得 : t×M ≡ a2 - ans (mod b2)(这一看就是 扩展欧几里得)(ax ≡ c (mod b))

所以 此时 t 就相当于是 x ,M 相当于是a ,a2 - ans 就相当于是c

所以利用扩展欧几里得 可以 解得t

但是 我们 要考虑 一个问题 扩展欧几里得 的操作

也就是说 我们解得的t 其实是 t × M ≡ gcd(M,b2) (mod b2) 的解

所以 a2 - ans 到 gcd(M,b2) 相当于是乘了一个 gcd(M,b2)/(a2 - ans) 所以我们得到的解 也相当于是 乘了 一个gcd(M,b2)/(a2 - ans)

那么真正的 t 应该是 t/((gcd(M,b2)/(a2 - ans))

也就是 t * (a2 - ans)/gcd(M,b2)

那么 对于下一次 求解来说

更新答案 : ans = ans + t * M,然后 ans = (ans%M + M) % M 保证ans 是最小的正整数解

  因为 LCM(M,b2) =  M×b2 /(gcd(M,b2)) 所以 M *= b2 /(gcd(M,b2))。

同理 循环 n - 1 次 得到最小的 ans 也就是要求的 x

下面贴代码

#include <cstdio>
#include <cctype>
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int maxn = 100005;int n;LL ai[maxn],bi[maxn];LL quickmul(LL a,LL b,LL mod)// 这是龟速乘
{LL res = 0;while(b){if(b & 1) res = (res + a) % mod;a = (a + a) % mod;b >>= 1; }return res % mod;
}LL exGcd(LL a,LL b,LL &x,LL &y)// 扩欧
{if(!b){x = 1;y = 0;return a;}LL r = exGcd(b,a%b,x,y);LL t = x; x = y; y = t - a/b * y;return r;
}LL exCrt()
{LL x,y;LL M = bi[1], ans = ai[1];//  特判 第一组 解 for(int i=2;i<=n;i++){LL a = M, b = bi[i], c = (ai[i] - ans % b + b) % b;// a*x ≡ c (mod b)
        LL gcd = exGcd(a,b,x,y);x = quickmul(x,c/gcd,b/gcd);// 相当于 x *= c/gcd
        ans += x * M;M *= (b / gcd);ans = (ans % M + M) % M;// 找最小的ans
    }return (ans % M + M) % M;
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&bi[i],&ai[i]);printf("%lld",exCrt());return 0;
}

转载于:https://www.cnblogs.com/-Wind-/p/10705070.html

[扩展中国剩余定理(EXCRT)]相关推荐

  1. 中国剩余定理(CRT)扩展中国剩余定理(exCRT)

    前言 中国剩余定理(也叫孙子定理)并不是很复杂,由于最近用到了,以前学的时候还不写博客,所以现在补一下 中国剩余定理(CRT) 问题 给出nnn个同余方程 x≡a1(modp1)x≡a2(modp2) ...

  2. 扩展中国剩余定理 exCRT 学习笔记

    前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...

  3. P4777-[模板]扩展中国剩余定理(EXCRT)

    正题 题目链接:https://www.luogu.org/problem/P4777 题目大意 求方程 {x≡a1(modb1)x≡a2(modb2)...x≡an(modbn)\begin{cas ...

  4. 中国剩余定理(CRT)和扩展中国剩余定理(EXCRT)

    Tip:建议读者不要太着急后翻,按照顺序阅读有助于理解 中国剩余定理(CRT) 问题引出 "有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何?"即,一个整数除以三余 ...

  5. [数论]-----中国剩余定理(扩展中国剩余定理)

    中国剩余定理 中国剩余定理(CRT)用于求形如: { x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋯ ⋯ x ≡ a k ( m o d m k ) \be ...

  6. 中国剩余定理 扩展中国剩余定理 模板

    中国剩余定理解线性同余线性方程 /*long long gcd(LL a,LL b) {return b==0?a:gcd(b,a%b); }*/ #include<bits/stdc++.h& ...

  7. 中国剩余定理 扩展中国剩余定理 (模板)

    中国剩余定理 && 扩展中国剩余定理 一个整数除以三余二,除以五余三,除以七余二,求这个整数. 例题: 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % ...

  8. 数学--数论--中国剩余定理+扩展中国剩余定理(孙子定理)

    中国剩余定理 问题 求解同余方程组 其中m1,m2,m3...mkm_1,m_2,m_3...m_km1​,m2​,m3​...mk​为两两互质的整数 求x的最小非负整数解 定理 令M=∏i=1kmi ...

  9. 模线性方程(中国剩余定理+扩展中国剩余定理)

    已知一系列除数和模数,求最小的满足条件的数 我们先考虑一般的情况,即模数不互质.(扩展中国剩余定理) 我们考虑两个方程的情况 x%M=R x=k1∗M+Rx=k1 * M+Rx=k1∗M+R x%m= ...

最新文章

  1. 日期格式YYYY-mm-dd HH:MM:SS大小写解释
  2. iOS10 NSURLErrorDomain Code 1200
  3. react java_独眼巨人React组织了Java 8库的寒武纪爆发
  4. 在WebGL场景中进行棋盘操作的实验
  5. centos7 安装redis_Redis6安装(上) - 单机单实例
  6. Python实现二叉树的遍历
  7. 阿里CTO张建锋:明年双11将大规模应用含光AI芯片
  8. 职称计算机提前考试试卷,职称计算机考试多项选择考试卷模拟考^试题
  9. numpy 二维、高维矩阵重新排列轴与数据(轴转换)
  10. Strategy模式的一点思考
  11. html+默认ie11,IE11浏览器设置成默认浏览器的方法
  12. 抄底利器!如何用Python量化 识别股票双底形态走势!
  13. 江苏最新建筑施工塔式起重机(建筑特种作业)特种工(塔式起重机)机考题库真题及答案解析
  14. VS2019 MFC ODBC 操作SQL SERVER 数据库
  15. mac u盘linux 双系统安装教程,U盘安装MAC双系统完美方案实现在MAC系统下使用双系统...
  16. MMORPG游戏的典型架构
  17. RT-Thread Studio学习(四)infrared软件包
  18. 我是Papi酱,一个集才华与美貌于一身的过气网红
  19. 音视频从入门到精通——FFmpeg分离出PCM数据实战
  20. 所学计算机课程或艺术技能,浅议小学计算机教学论文

热门文章

  1. 浅谈Java中的各种锁
  2. Redis再入门 codis 对比 Memcached
  3. Tomcat在Eclipse下的启动
  4. oracle 如何创建游标,Oracle--plsql游标创建和使用
  5. 在Sping Boot logback的使用
  6. python设计模式20-状态模式
  7. Linux 初始化之 Systemd机制简介
  8. 查看Linux版本系统信息方法汇总
  9. 长挺丑,Go 最新的泛型类型约束语法介绍
  10. Dubbo核心知识点