1. 程式人生 > 實用技巧 >數學 同餘問題

數學 同餘問題

1.擴充套件歐幾里得演算法:

  • 求解問題a,b,qcd(a,b)=d;擴充套件歐幾里得演算法就是求出這麼一組解ax+by=d
  • 推導過程

  • 如果求出來易祖傑x0,y0,那麼通解x=x0+k*【a/d】 y=y0-k*[b/d]k整數就可
  • 通常形式ax同餘b(mod c)
  • 那麼就轉化成ax+cy=b

T1求解線性同餘方程 ax同餘1(mod b) 轉化為 ax+by=1,就可以了

  • 注意求最小正餘數的套路(x%b+b)%b;
  • exgcd的返回值是gcd要注意
  • 寫成exgcd(b,a%b,y,x)y-=a/b*x更好些
  • 程式碼如下:
  • #include <stdio.h>
    #include 
    <algorithm> #include <cstring> using namespace std; typedef long long ll; 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,y,x);//繼續遞迴 y-=a/b*x; return d; } int main() { int a,b; scanf("%d%d",&a,&b);
    int x,y; exgcd(a,b,x,y); printf("%d",(x%b+b)%b); return 0; }
    View Code

    如果中間會爆int的話,就需要ll就可以了