非扩展

用于求解线性同余方程组 ,其中模数两两互质 .

先来看一看两个显然的定理:

1.若 x \(\equiv\) 0 (mod p) 且 y \(\equiv\) 0 (mod p) ,则有 x+y \(\equiv\) 0 (mod p)

2.若 x \(\equiv\) b (mod p) 且 y \(\equiv\) 0 (mod p), 则有 x+y \(\equiv\) b (mod p) (0$\leq $b<p)

则整个方程组可以写为

b1 \(\begin{bmatrix}1\\0\\0\end{bmatrix}\) + $\cdots $+ bi \(\begin{bmatrix}0\\1\\0\end{bmatrix}\) + $\cdots $ + bn \(\begin{bmatrix}0\\0\\1\end{bmatrix}\)

也就是说,想要求出最终方程组的解就只需要求出上面每个行列式的值。

考虑每个式子中,因为每两个模数之间两两互质,设 N=$ \sum_{i=1}^nm_i$

则GCD(\(\frac{N}{m_i}\) , mi) = 1 , N/mi即为其他模数的lcm,即为其他n-1个方程的解,第i个方程的解可以写成xi=N / mi * y

即 N/mi * y \(\equiv\) 1 (mod mi)

此方程等价于 N/mi * y + mi * z=1 ,可以用扩展欧几里得求解。

求出xi后 ,有 bi * xi $\equiv $ bi (mod mi)

最后整个方程组的解就为 X = $\sum_{i=1}^n b_i * x_i $ mod N

Code:


  1. #include<stdio.h>
  2. #define N 100
  3. long long W[N],B[N],nn,T;
  4. inline void exgcd(long long a,long long b,long long &x,long long &y){
  5. if(!b){
  6. x=1;y=0;
  7. }else{
  8. exgcd(b,a%b,x,y);
  9. long long t=x;
  10. x=y;
  11. y=t-a/b*y;
  12. }
  13. }
  14. inline long long China(long long k){
  15. long long x,y,a=0,m,n=1;
  16. for(long long i=0;i<k;i++) n*=W[i];
  17. for(long long i=0;i<k;i++){
  18. m=n/W[i];
  19. exgcd(W[i],m,x,y);
  20. a=a+y*B[i]*m;
  21. }
  22. a%=n;
  23. while(a<=0) a+=n;
  24. while(a>=n) a-=n;
  25. return a;
  26. }
  27. signed main(){
  28. scanf("%lld",&nn);
  29. for(long long i=0;i<nn;i++)
  30. scanf("%lld",&B[i]);
  31. for(long long i=0;i<nn;i++)
  32. scanf("%lld",&W[i]);
  33. for(long long i=0;i<nn;i++)
  34. B[i]=(B[i]%W[i]+W[i])%W[i];
  35. printf("%lld",China(nn));
  36. }

扩展

刚刚学习了中国剩余定理,现在来学习它的扩展。先说句闲话,不知道是不是扩展过头了,其实中国剩余定理和它的扩展关系不大,所以先请忘记刚刚在上文所看到的一切套路,开始新的征程。

好了,现在模数不是两两互质的了,也就是说先前求的N不是它们的LCM,不能直接用。

我们考虑构造的方法,假设我们已经求出了前k-1个方程的和解,现在需要合并第k个方程。

设前k-1个方程的和解为X,则他们的通解可以写成 X + t * N (其中N为前k-1个模数的LCM)

则要合并第k个方程,即要解如下方程

\[X + t * N \equiv b_k ( mod m_k )
\]

此方程又等价于 $$ t * N + m_k * y = b_k-X $$

晃眼一看,又是扩展欧几里得。求出 t 后 ,前k个方程的解就为 X' = X + t * N , 继续更新 N ,N = LCM(N,\(m_k\))

Code:

  1. #include<stdio.h>
  2. #define N 100006
  3. #define ll long long
  4. ll a[N],b[N],ans,B,M,GCD,x,y;
  5. int n;
  6. template<class T>
  7. inline void read(T &x){
  8. x=0;T flag=1;char c=getchar();
  9. while(c<'0'||c>'9'){if(c=='-') flag=-1;c=getchar();}
  10. while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}
  11. x*=flag;
  12. }
  13. inline ll exgcd(ll a,ll b,ll &xx,ll &yy){
  14. if(!b){
  15. xx=1;yy=0;
  16. return a;
  17. }
  18. ll gcd=exgcd(b,a%b,xx,yy);
  19. ll tmp=xx;
  20. xx=yy;
  21. yy=tmp-(a/b)*yy;
  22. return gcd;
  23. }
  24. inline ll mul(ll a,ll b,ll Mod){
  25. ll ans=0;
  26. while(b){
  27. if(b&1) ans=(ans+a)%Mod;
  28. a=(a<<1)%Mod;
  29. b>>=1;
  30. }
  31. return ans;
  32. }
  33. int main(){
  34. read(n);
  35. for(int i=1;i<=n;i++)
  36. read(a[i]),read(b[i]);
  37. ans=b[1];
  38. M=a[1];
  39. for(int i=2;i<=n;i++){
  40. B=(b[i]-ans%a[i]+a[i])%a[i];
  41. GCD=exgcd(M,a[i],x,y);
  42. x=mul(x,B/GCD,a[i]);
  43. ans+=M*x;
  44. M*=a[i]/GCD;
  45. ans=(ans%M+M)%M;
  46. }
  47. printf("%lld",ans);
  48. }
  49. /*
  50. 3
  51. 11 6
  52. 25 9
  53. 33 17
  54. */

CRT&EXCRT学习笔记的更多相关文章

  1. CRT & EXCRT 学习笔记

    这玩意解决的是把同余方程组合并的问题. CRT的核心思想和拉格朗日插值差不多,就是构造一组\(R_i\)使得$\forall i,j(i \neq j) $ \[R_im_i = 1, R_im_j ...

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

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

  3. CRT和EXCRT学习笔记

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

  4. crt,excrt学习总结

    \(crt,Chinese\ Remainder\ Theorem\) 概述 前置技能:同余基础性质,\(exgcd\). \(crt\),中国剩余定理.用于解决模数互质的线性同余方程组.大概长这样: ...

  5. 「中国剩余定理CRT」学习笔记

    设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...

  6. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  7. Linux学习笔记(7)CRT实现windows与linux的文件上传下载

    Linux学习笔记(7)CRT实现windows与linux的文件上传下载 按下Alt + p 进入SFTP模式,或者右击选项卡进入 命令介绍 help 显示该FTP提供所有的命令 lcd 改变本地上 ...

  8. [笔记] CRT & exCRT

    [笔记] CRT & exCRT 构造法 求多组\(x \equiv r_i (\bmod d_i)\)的解,\(d_i\)互质 余数\((r_i = remainder)\),除数\((d_ ...

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

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

随机推荐

  1. 01-day-vuex的使用

    知识点1===>简单的使用vuex 进行state取值 使用yarn下载 yarn add vuex -D vuex的包叫做 store 跟pages同级 创建store文件夹,文件夹下有sto ...

  2. C++ class内的=重载,拷贝赋值函数copy op=,重载示例。必须是class内

    #include <iostream> // overloading "operator = " inside class // = 是一元操作符.不写,编译器会提供 ...

  3. Eclipse GitHub SSH2 key配置

    1. 用Eclipse自带git插件进行配置我们的用户名和密码,即是自己github注册用户. 2.windows -- perferences--General--Network Commectio ...

  4. 深入理解Linux内核 学习笔记(8)

    第八章 系统调用 API定义了一个给定的服务:系统调用是通过软中断向内核发出一个明确的请求. API可能不调用系统调用,也可能调用多个系统调用. Linux系统调用必须通过执行int 0x80,系统调 ...

  5. CSP-S 2019 题解

    D1T1-格雷码 题中给出了构造格雷码的方法. $solve(n,k)$表示求出$2^n$意义下排名为$k$的格雷码, 只要比较一下考虑最高位的0/1取值就好了. 部分分提示了要开$unsigned\ ...

  6. HTML连载18-id选择器与class区别&class选择器使用思路&后代选择器

    一.id选择器和classable选择器的区别 选择器 CSS中的开头 HTML标签可以绑定几个 是否可重复 用途 id选择器 # 仅能一个 不可以重复(一个标签里仅有一个) 一般情况下是给JS用的, ...

  7. LeetCode 394:字符串解码 Decode String

    题目: 给定一个经过编码的字符串,返回它解码后的字符串. Given an encoded string, return its decoded string. 编码规则为: k[encoded_st ...

  8. 关于Idea突然无法输入的诡异问题解决

    问题描述 最近加班把自己的装有Debian的笔记本带到公司,使用Idea写代码的时候,突然间无法输入,ctrl与tab还可用,重启Idea能得到一阵的解决 解决参考 如果是Linux平台,请考虑是否是 ...

  9. JDBC解耦案例

    原始JDBC连接 package jdbc; import org.junit.jupiter.api.Test; import java.sql.Connection; import java.sq ...

  10. Jms规范学习

    1.什么是消息中间件? 关注于数据的发送和接受,利用高效可靠的异步消息传递机制集成分布式系统. 2.什么是JMS? Java消息服务(java Message Service)即JMS,是一个java ...