zoukankan      html  css  js  c++  java
  • [拓展欧几里得exGcd]

    题目描述

    求关于$x$的同余方程$$ax=1(mod~~b)$$的最小正整数解。

    输入输出格式

    输入格式:

    一行,包含两个正整数$a$,$b$用一个空格隔开。

    输出格式:

    一个正整数$x$,即最小正整数解。输入数据保证一定有解。


    裴蜀定理:关于$x$,$y$的方程$ax+by=c$有解当且仅当$gcd(a,b)|c$

    令 $c = gcd(a,b)$

    由 欧几里得算法 得

        $$gcd(a,b) = gcd(b,a~mod~b)$$

      所以原式可化为$$ax+by=gcd(a,b)$$

              $$ax + by = gcd(b,a~mod~b)$$

             $$bx_{0} + (a~mod~b)y_{0} = gcd(b,a~mod~b)$$

      所以$$ax+by=bx_{0}+(a-lfloorfrac{a}{b} floor*b)~y_{0}=ay_{0}+b(x_{0}-lfloorfrac{a}{b} floor~y_{0})$$

    所以 $$x=y_{0}~~y=x_{0}-lfloorfrac{a}{b} floor~y_{0}$$

    考虑他的一组特解:

    $$b=0时,x=1,y=0$$

    求上述方程的所有解
    假设求出的该方程的一组特解$x=x_{0},y=y_{0}$,则该方程的所有解为$$x=x_{0}+frac{k*b}{gcd(a,b)},y=y_{0}-frac{k*a}{gcd(a,b)}$$

    代码:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 int a,b,x,y;
     6 int exGcd(int a,int b,int &x,int &y)
     7 {
     8     if(!b)
     9     {
    10         x = 1;
    11         y = 0;
    12         return a;
    13     }
    14     exGcd(b,a%b,x,y);
    15     int t = x; x = y; y = t - a/b * y;
    16 }
    17 
    18 int main()
    19 {
    20     scanf("%d%d",&a,&b);
    21     exGcd(a,b,x,y);
    22     printf("%d",(x % b + b) % b);
    23     return 0;
    24 }
  • 相关阅读:
    1033.采药1
    G——胜利大逃亡 (BFS)
    POJ 3278 Catch That Cow
    C
    11.17 dfs poj1979 Red and Black
    11.11反思
    kmp笔记
    dfs bfs
    1113
    python 类方法
  • 原文地址:https://www.cnblogs.com/-Wind-/p/10631483.html
Copyright © 2011-2022 走看看