<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      淺記線性同余方程(組)

      線性同余方程

      定義

      線性同余方程就是形如 \(ax\equiv b\pmod m\) 其中 \(a,b,m\) 是給定的整數。

      解法

      由同余的性質可知 \(m\mid ax-b\)\(ax-b=km\) 其中 \(k\in \mathbb{Z}\)

      如果我們設 \(k=-y\) 的話,就有 \(ax+my=b\),發現了嗎?其實這就是 Bézout 定理

      Bézout 定理我們可以得到,這個同余方程有解當且僅當 \(\gcd(a,m)\mid b\)

      我們考慮在有解的情況下使用擴展歐幾里得算法先求解出 \(ax+my=\gcd(a,m)\) 的一組特解 \(\left\{\begin{matrix}x=x_0 \\y=y_0\end{matrix}\right.\),然后呢,我們就可以得到 \(x=\frac{x_0\times b}{\gcd(a,m)}\) 就是原方程的一組解。

      關于擴展歐幾里得算法的說明

      內容

      我們考慮不定方程 \(ax+by=\gcd(a,b)\) 的一組特解,我們可以采用遞歸的方法來求解,實際上這也就是擴展歐幾里得算法:

      1. 顯然當 \(b=0\) 時,有 \(\left\{\begin{matrix}x=1\\y=0\end{matrix}\right.\) 滿足條件。
      2. \(b\ne 0\) 時,我們根據歐幾里得算法有 \(\gcd(a,b)=\gcd(b,a\bmod b)\) 于是,我們就有 \((a\bmod b)y+bx=\gcd(b,a\bmod b)\) 又由于 \((a\bmod b)y+bx=\left(a-b\times\lfloor\frac{a}{b}\rfloor\right)\times y+bx\)\(\operatorname{RHS}\) 展開,合并同類項后有 \((a\bmod b)y+bx=ay+b\times \left(x-\lfloor\frac{a}{b}\rfloor y\right)\) 于是,我們令 \(x_0=y,y_0=x-\lfloor \frac{a}{b}\rfloor y\) 就有 \(ax_0+by_0=\gcd(a,b)\)
      代碼實現

      根據上述內容,我們可以打出擴展歐幾里得算法的代碼:

      int exgcd(int a,int b,int&x,int&y){
      	if(b==0){
      		x=1;
      		y=0;
      		return a;
      	}
      	int d=exgcd(b,a%b,x,y);
      	int z=x;
      	x=y;
      	y=z-z*y;
      	return d;
      }
      
      功能介紹

      以上函數的返回值為 \(\gcd(a,b)\),注意到參數 \(x,y\) 均在前面加上了取地址符,表示在函數中可以改變 xy 的值,而函數運行完成后 xy 所保存的值就是 \(ax+by=\gcd(a,b)\) 的一組特解。

      一道模板題

      洛谷 P1082

      這道題目就是模板題,方程可以寫成 \(ax+by=1\) 的形式,于是我們使用擴展歐幾里得算法,可以求出特解 \(x_0\) 然后 \(x_0\bmod b\) 就是原方程的最小正整數解了。

      #include<bits/stdc++.h>
      #define int long long
      using namespace std;
      int a,b;
      int exgcd(int a,int b,int&x,int&y){
      	if(b==0){
      		x=1;
      		y=0;
      		return a;
      	}
      	int d=exgcd(b,a%b,x,y);
      	int z=x;
      	x=y;
      	y=z-(a/b)*y;
      	return d;
      }
      signed main(){
      	cin>>a>>b;
      	int x,y;
      	exgcd(a,b,x,y);
      	cout<<(x%b+b)%b;
      	return 0;
      }
      

      線性同余方程組

      作者太懶了,這里先講解更加寬泛的擴展中國剩余定理吧,等以后再講解特殊的中國剩余定理,順便宣傳一下博客:link

      問題簡述

      給定一個 \(k\) 個方程的線性同余方程組:

      \[\left\{\begin{matrix} x\equiv a_1\pmod {m_1}\\x\equiv a_2\pmod {m_2} \\\vdots \\x\equiv a_k\pmod {m_k} \end{matrix}\right.\]

      其中 \(m_1,m_2,\dots,m_k\) 不一定兩兩互質。

      解題方法

      我們的大致解題思路為將 \(2\) 個方程合并為一個新的方程,以此類推,最終我們會得到一個 \(x\equiv y\pmod z\) 的一個方程,易見上面的方程組的最小正整數解就是 \(y\)

      接下來我們來解決合并方程的問題,我們考慮如下兩個方程:

      \[\left\{\begin{matrix} x\equiv a_1\pmod {m_1}\\x\equiv a_2\pmod {m_2} \end{matrix}\right.\]

      我們根據第一個式子可以寫出 \(x\) 的通解 \(x=a_1+m_1\times k\) 其中 \(k\) 為任意整數,我們將這個通解帶入第二個式子就可以得到 \(a_1+m_1\times k\equiv a_2\pmod {m_2}\) 我們移一下項就可以得到 \(m_1\times k\equiv a_2-a_1\pmod {m_2}\),這就是上面的方程組合并后的結果。

      而這個方程有解的充要條件是 \(\gcd(m_1,m_2)\mid a_2-a_1\),這個其實就是裴蜀定理,這里不再概述。

      我們繼續講,我們得到這個充要條件后我們可以判斷這個方程是否有解,如果有解我們就繼續進行接下來的操作。

      我們設 \(d=\gcd(m_1,m_2)\),然后將我們合并的方程變換一下就是:

      \[\frac{m_1\times k}w0obha2h00\equiv \frac{a_2-a_1}w0obha2h00\pmod {\frac{m_2}w0obha2h00} \]

      然后,我們設 \(m_1'=\frac{m_1}w0obha2h00,c=\frac{a_2-a_1}w0obha2h00,m_2'=\frac{m_2}w0obha2h00\) 于是我們就有:

      \[m_1'\times k\equiv c\pmod {m_2'} \]

      注意到此時 \(m_1',m_2'\) 互質,所以 \(m_1'\) 在模 \(m_2'\) 的意義下存在乘法逆元,我們可以使用擴展歐幾里得算法來求出逆元,即求出整數 \(inv\) 使得 \(m_1'\times inv\equiv 1\pmod {m_2'}\),所以我們繼續將這個方程變換就變成了:

      \[k\equiv c\times inv\pmod {m_2'} \]

      如果我們記 \(k_0=c\times inv\)\(k\) 的通解為 \(k_0+m_2'\times t\) 其中 \(t\) 為任意整數。

      然后我們將這個 \(k\) 帶回一開始的式子就可以得出:

      \[\begin{aligned} x&=a_1+m_1\times(k_0+m_2'\times t)\\ &=(a_1+m_1\times k_0)+(m_1\times m_2')\times t\\ &=(a_1+m_1\times k_0)+\frac{m_1\times m_2}w0obha2h00\times t\\ &=(a_1+m_1\times k_0)+\mathrm{lcm}(m_1,m_2)\times t\end{aligned}\]

      我們設 \(x_0=a_1+m_1\times k_0,L=\mathrm{lcm}(m_1,m_2)\) 所以我們就愉快地得出了:

      \[\left\{\begin{matrix} x\equiv a_1\pmod {m_1}\\x\equiv a_2\pmod {m_2} \end{matrix}\right.\Longleftrightarrow x\equiv x_0\pmod L\]

      于是,我們完成了合并方程的使命!

      最后其實就是一個遞推的過程我們一次合并前 \(2\) 個方程,最后就能得到答案!

      代碼實現

      #include<bits/stdc++.h>
      #define LL __int128
      #define R register
      using namespace std;
      namespace fastIO{char *p1,*p2,buf[100000];
      	#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
      	inline void read(LL&n){LL x=0,f=1;char ch=nc();while(ch<48||ch>57){if(ch=='-'){f=-1;}ch=nc();}while(ch>=48&&ch<=57){x=(x<<3)+(x<<1)+(ch^48),ch=nc();}n=x*f;}inline void read(string&s){s="";char ch=nc();while(ch==' '||ch=='\n'){ch=nc();}while(ch!=' '&&ch!='\n'){s+=ch,ch=nc();}}inline void read(char&ch){ch=nc();while(ch==' '||ch=='\n'){ch=nc();}}inline void write(LL x){if(x<0){putchar('-'),x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');return;}inline void write(const string&s){for(R LL i=0;i<(int)s.size();i++){putchar(s[i]);}}inline void write(const char&c){putchar(c);}
      }using namespace fastIO;
      inline LL mul(LL a,LL b,const LL&mod){
          a=(a%mod+mod)%mod; 
          b=(b%mod+mod)%mod;
          LL res=0;
          while(b){
              if(b&1)res=(res+a)%mod;
              a=(a+a)%mod;
              b>>=1;
          }
          return res;
      }
      void exgcd(LL a,LL b,LL&x,LL&y){
          if(b==0){
              x=1;
              y=0;
          }
      	else{
              exgcd(b,a%b,y,x);
              y-=x*(a/b);
          }
      }
      LL inv_mod(LL a,LL m){
          LL x,y;
          exgcd(a,m,x,y);
          return (x%m+m)%m;
      }
      LL gcd(LL a,LL b){
          return b?gcd(b,a%b):a;
      }
      LL n,a[100005],b[100005];
      signed main(){
          read(n);
          for(int i=0;i<n;i++){
          	read(a[i]);
          	read(b[i]);
          }
          LL a0=a[0];
          LL b0=(b[0]%a0+a0)%a0;
          for(int i=1;i<n;i++){
              LL ai=a[i];
              LL bi=(b[i]%ai+ai)%ai;
              LL d=gcd(a0,ai);
              LL dif=bi-b0;
              LL a0_=a0/d;
              LL ai_=ai/d;
              LL dif_=dif/d;
              LL c=(dif_%ai_+ai_)%ai_;
              LL inv=inv_mod(a0_,ai_);
              LL t0=mul(inv,c,ai_);
              LL a0__=(a0/d)*ai;
              LL mod__=a0__;
              LL p=mul(a0,t0,mod__);
              LL b0__=(b0+p)%mod__;
              a0=mod__;
              b0=b0__;
          }
      	write(b0);
          return 0;
      }
      

      一些例題

      如果有不會的可以回復作者!

      posted @ 2025-10-30 11:11  盼滿天繁星  閱讀(68)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 一本无码在线观看| 日韩精品无码人妻一区二区三区| 上司的丰满人妻中文字幕| 大连市| 蜜桃视频无码区在线观看 | 阿巴嘎旗| 亚洲另类激情专区小说婷婷久| 亚洲国产精品一二三区| 宝贝腿开大点我添添公视频免| 蜜臀av午夜精品福利| 亚洲AV日韩AV综合在线观看| 亚洲AV永久无码精品秋霞电影影院| 免费可以在线看a∨网站| 小13箩利洗澡无码视频网站| 国产成人精品视频网站| 国产97人人超碰caoprom| 日韩美少妇大胆一区二区| 2020年最新国产精品正在播放| 国产精品三级一区二区三区| 精品免费看国产一区二区| 免费无码AV一区二区波多野结衣| 中文字幕人妻中文AV不卡专区 | 国产成人午夜精品福利| 亚洲欧美中文日韩V日本| 精品一区二区三区四区色| 丁香花成人电影| 成人福利国产午夜AV免费不卡在线 | 久久国产乱子精品免费女| 鹤庆县| 99福利一区二区视频| 日韩一区二区三区日韩精品| 自拍日韩亚洲一区在线| 免费看婬乱a欧美大片| 伊人精品久久久大香线蕉| 韩国三级网一区二区三区| 久久国内精品自在自线91| 人妻综合专区第一页| 欧美精品18videosex性欧美| 久久se精品一区二区三区| 亚洲国产成人精品综合色| 午夜福利精品国产二区|