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 }
  • 相关阅读:
    cropperjs图片裁剪工具、NProgress进度条
    Chrome浏览器上安装Vue Devtools
    原生JS---数组去重总结
    原生JS--获取DOM节点
    call,apply,bind初识
    原生JS--数组循环总结
    01-vue项目之滚动加载数据
    原生JS---解构赋值
    克隆数组的几种方式?
    原生JS设置、删除、获取Cookie
  • 原文地址:https://www.cnblogs.com/-Wind-/p/10631483.html
Copyright © 2011-2022 走看看