数学 同余问题

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就可以了

posted @ 2020-10-20 12:55  ILH  阅读(120)  评论(0)    收藏  举报