先扔个模板题。链接

简化题意:他让我求 \(x \equiv a_i \pmod{m_i}\) 的解。

例如,\(
\begin{cases}
x \equiv 1 \pmod{3} \\
x \equiv 1 \pmod{5} \\
x \equiv 2 \pmod{7}
\end{cases}
\) 这是样例。

令 \(M=m_1m_2\ldots m_n,M_i=M/m_i\) 。

显然 \(\gcd(M_i,m_i)=1\),所以 \(M_i\) 关于 \(m_i\) 的逆元存在,将其设为 \(t_i\)。

于是有 \(M_it_i \equiv 1 \pmod{m_i},M_it_i \equiv 0 \pmod{m_j}(j\ne i)\)。

把上面每个式子左右两边同乘 \(a_i\) ,就得到 \(M_it_ia_i \equiv a_i \pmod{m_i},M_it_ia_i \equiv 0 \pmod{m_j}(j\neq i)\)。

然后你惊奇的发现答案出来了。

代码:

  1. #include<stdio.h>
  2. #define reg register
  3. #define ri reg int
  4. #define rep(i, x, y) for(ri i = x; i <= y; ++i)
  5. #define nrep(i, x, y) for(ri i = x; i >= y; --i)
  6. #define DEBUG 1
  7. #define ll long long
  8. #define il inline
  9. #define max(i, j) (i) > (j) ? (i) : (j)
  10. #define min(i, j) (i) < (j) ? (i) : (j)
  11. #define read(i) io.READ(i)
  12. #define print(i) io.WRITE(i)
  13. #define push(i) io.PUSH(i)
  14. struct IO {
  15. #define MAXSIZE (1 << 20)
  16. #define isdigit(x) (x >= '0' && x <= '9')
  17. char buf[MAXSIZE], *p1, *p2;
  18. char pbuf[MAXSIZE], *pp;
  19. #if DEBUG
  20. #else
  21. IO() : p1(buf), p2(buf), pp(pbuf) {}
  22. ~IO() {
  23. fwrite(pbuf, 1, pp - pbuf, stdout);
  24. }
  25. #endif
  26. inline char gc() {
  27. #if DEBUG
  28. return getchar();
  29. #endif
  30. if(p1 == p2)
  31. p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin);
  32. return p1 == p2 ? ' ' : *p1++;
  33. }
  34. inline bool blank(char ch) {
  35. return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
  36. }
  37. template <class T>
  38. inline void READ(T &x) {
  39. register double tmp = 1;
  40. register bool sign = 0;
  41. x = 0;
  42. register char ch = gc();
  43. for(; !isdigit(ch); ch = gc())
  44. if(ch == '-') sign = 1;
  45. for(; isdigit(ch); ch = gc())
  46. x = x * 10 + (ch - '0');
  47. if(ch == '.')
  48. for(ch = gc(); isdigit(ch); ch = gc())
  49. tmp /= 10.0, x += tmp * (ch - '0');
  50. if(sign) x = -x;
  51. }
  52. inline void READ(char *s) {
  53. register char ch = gc();
  54. for(; blank(ch); ch = gc());
  55. for(; !blank(ch); ch = gc())
  56. *s++ = ch;
  57. *s = 0;
  58. }
  59. inline void READ(char &c) {
  60. for(c = gc(); blank(c); c = gc());
  61. }
  62. inline void PUSH(const char &c) {
  63. #if DEBUG
  64. putchar(c);
  65. #else
  66. if(pp - pbuf == MAXSIZE) {
  67. fwrite(pbuf, 1, MAXSIZE, stdout);
  68. pp = pbuf;
  69. }
  70. *pp++ = c;
  71. #endif
  72. }
  73. template <class T>
  74. inline void WRITE(T x) {
  75. if(x < 0) {
  76. x = -x;
  77. PUSH('-');
  78. }
  79. static T sta[35];
  80. T top = 0;
  81. do {
  82. sta[top++] = x % 10;
  83. x /= 10;
  84. } while(x);
  85. while(top)
  86. PUSH(sta[--top] + '0');
  87. }
  88. template <class T>
  89. inline void WRITE(T x, char lastChar) {
  90. WRITE(x);
  91. PUSH(lastChar);
  92. }
  93. } io;
  94. ll a[20], m[20], _M = 1, M[20], t[20];
  95. void Exgcd(ll a, ll b, ll &x, ll &y) {
  96. if (!b) x = 1, y = 0;
  97. else Exgcd(b, a % b, y, x), y -= a / b * x;
  98. }
  99. int main() {
  100. int n;
  101. ll x = 0, y = 0, ans = 0;
  102. read(n);
  103. rep(i, 1, n) read(m[i]), read(a[i]), _M *= m[i];
  104. rep(i, 1, n) M[i] = _M / m[i];
  105. rep(i, 1, n) {
  106. x = 0, y = 0;
  107. Exgcd(M[i], m[i], x, y);
  108. t[i] = x < 0 ? x + m[i] : x;
  109. }
  110. rep(i, 1, n) ans += (a[i] * M[i] * t[i]), ans %= _M;
  111. print(ans > 0 ? ans : ans + _M);
  112. return 0;
  113. }

附:逆元 (数年前的笔记)

\(C^m_n = C^{n-m}_n = {n! \over m! \times (n-m)!}\)

如果\(n \times m \equiv 1 \pmod{p}\),那么我们称\(m\)为\(n\)的逆元,即\(n^{-1} \pmod{p}\)

\({n \over m} \equiv n \times m^{-1} \pmod{p}\)

\({1 \over 2} \equiv 1 \times 2^{-1} \equiv 3 \pmod{5}\)

\(2 \times 3 \equiv 1 \pmod{5}\)

\(2^{-1} \equiv 3 \pmod{5}\)

费马小定理:\(m\)是大于\(1\)的整数,那么\(a^m \equiv a \pmod{m}\)

扩展:如果\(p\)是质数,那么\(a^{p-1} \equiv 1 \pmod{p}\),\(a^{p-2} \equiv a^{-1} \pmod{p}\)

如果\(p\)是质数,那么\(1,2,3,...,p-1\)都存在逆元

如果\(m\)是合数,那么\(1,2,3,...,m-1\)不都存在逆元

不存在\(k\)使得\(2 \times k \equiv 1 \pmod{4}\)

CRT(中国剩余定理)学习笔记的更多相关文章

  1. 扩展中国剩余定理学习笔记+模板(洛谷P4777)

    题目链接: 洛谷 题目大意:求同余方程组 $x\equiv b_i(mod\ a_i)$ 的最小正整数解. $1\leq n\leq 10^5,1\leq a_i\leq 10^{12},0\leq ...

  2. CRT中国剩余定理 & Lucas卢卡斯定理

    数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...

  3. CRT和EXCRT学习笔记

    蒟蒻maomao终于学会\(CRT\)啦!发一篇博客纪念一下(还有防止忘掉) \(CRT\)要解决的是这样一个问题: \[x≡a_1​(mod m_1​)\] \[x≡a_2​(mod m_2​)\] ...

  4. CRT&EXCRT 中国剩余定理及其扩展

    前言: 中国剩余定理又名孙子定理.因孙子二字歧义,常以段子形式广泛流传. 中国剩余定理并不是很好理解,我也理解了很多次. CRT 中国剩余定理 中国剩余定理,就是一个解同余方程组的算法. 求满足n个条 ...

  5. CRT和EXCRT简单学习笔记

    中国剩余定理CRT 中国剩余定理是要求我们解决这样的一类问题: \[\begin{cases}x\equiv a_1\pmod {b_1} \\x\equiv a_2 \pmod{b_2}\\...\ ...

  6. 「ExLucas」学习笔记

    「ExLucas」学习笔记 前置芝士 中国剩余定理 \(CRT\) \(Lucas\) 定理 \(ExGCD\) 亿点点数学知识 给龙蝶打波广告 Lucas 定理 \(C^m_n = C^{m\% m ...

  7. [SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告

    题目链接:https://www.luogu.org/problemnew/show/P2480 题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色 ...

  8. 学习笔记:中国剩余定理(CRT)

    引入 常想起在空间里见过的一些智力题,这个题你见过吗: 一堆苹果,\(3\)个\(3\)个地取剩\(1\)个,\(5\)个\(5\)个地取剩\(1\)个,\(7\)个\(7\)个地取剩\(2\)个,苹 ...

  9. 扩展中国剩余定理(EXCRT)学习笔记

    扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...

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

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

随机推荐

  1. 13、ssh跳板机

    13.1.前提条件: 1.跳板机服务器和其它服务器建立了ssh秘钥登录: 2.目前的环境: (1)各服务器上都建立了lc用户,并给于sudo (lc ALL= NOPASSWD:ALL )权限,lc就 ...

  2. 在FLEX中真正的隐藏一个组件,隐藏后不占据自身的位置. (转)

    一直被这个问题困扰,就是在设置UI的Visible的时候,改组件的位置一直被占着,比较恶心,今天在这里发现了一个方法, 操作方法如下设置: includeInLayout为false即可 来自:htt ...

  3. SpringCloud:Eureka 配置心跳机制

    Server服务端 server:   port: 8761 eureka:   client:     #实例是否在eureka服务器上注册自己的信息以提供其他服务发现,默认为true     re ...

  4. XCTF IgniteMe

    一.查壳 结论: 1.用vc++编译的. 2.无壳,毕竟是一分的题 二.点击运行,发现不是爆破,而是找出注册机,汇编功力还在提升中,只能拖入ida来静态调试了 具体的见注释: 二.1点击进入关键函数 ...

  5. 全网唯一开源java开发的支持高扩展,高性能的Mqtt集群broker!

    SMQTT是一款开源的MQTT消息代理Broker, SMQTT基于Netty开发,底层采用Reactor3反应堆模型,支持单机部署,支持容器化部署,具备低延迟,高吞吐量,支持百万TCP连接,同时支持 ...

  6. solr_hacktool

    https://github.com/mustblade/solr_hacktool 最近复现了几个solr漏洞,没找到现成工具,就心血来潮写了个小玩具.没了.

  7. spring中如何向一个单例bean中注入非单例bean

    看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...

  8. 【spring源码系列】之【Bean的初始化】

    只要不放弃,希望迟早都会到来! 1. Bean的初始化 如果把bean的生命周期看作一个婴儿诞生过程的,那么创建实例相当于婴儿从母体出来,一丝不挂光秃秃:属性赋值相当于给宝宝的头带帽子,上身穿衣服.下 ...

  9. C语言:char 常量写法及变量赋值

    #include <stdio.h> main() { char zfx_1,zfx_2,zfx_3,zfx_4,zfx_5,zfx_6,zfx_7,zfx_8; zfx_1='a';// ...

  10. Vue.js源码解析-Vue初始化流程之动态创建DOM

    目录 前言 一._update 如何判断是初始化还是更新操作? 二.patch 2.1 patch 定义 2.2 初始化的 patch 三.createElm 动态创建DOM 3.1 创建组件节点 3 ...