• 【扩展欧几里得】NOIP2012同余方程


    题目描述

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

    输入输出格式

    输入格式:

    输入只有一行,包含两个正整数 a, b,用一个空格隔开。

    输出格式:

    输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

    输入输出样例

    输入样例#1: 复制
    3 10
    输出样例#1: 复制
    7

    说明

    【数据范围】

    对于 40%的数据,2 ≤b≤ 1,000;

    对于 60%的数据,2 ≤b≤ 50,000,000;

    对于 100%的数据,2 ≤a, b≤ 2,000,000,000。

    NOIP 2012 提高组 第二天 第一题

    题解

    顺便把欧几里得算法也写上了

    证明:

    其实欧几里得算法就是辗转相除法。。。

    扩展欧几里得就是

    对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然
     
    存在整数对 x,y ,使得 gcd(a,b)=ax+by。
     
    求解 x,y的方法的理解
     
    设 a>b。
     
    1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
     
    2,a>b>0 时
     
    设 ax1+ by1= gcd(a,b);
     
    bx2+ (a mod b)y2= gcd(b,a mod b);
     
    根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b);
     
    则:ax1+ by1= bx2+ (a mod b)y2;
     
    即:ax1+ by1= bx2+ (a - [a / b] * b)y2=ay2+ bx2- [a / b] * by2;
     
    也就是ax1+ by1 == ay2+ b(x2- [a / b] *y2);
     
    根据恒等定理得:x1=y2; y1=x2- [a / b] *y2;
     
    这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
     
    上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

    代码

    //by 减维
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    #include<cstdlib>
    #include<ctime>
    #include<cmath>
    #include<map>
    #include<bitset>
    #include<algorithm>
    #define ll long long
    #define maxn
    using namespace std;
    
    ll n,m;
    
    ll gcd(ll x,ll y)
    {
        return y?gcd(y,x%y):x;
    }
    
    ll exgcd(ll a,ll b,ll &x,ll&y)
    {
        if(b==0){
            x=1,y=0;
            return a;
        }
        ll q=exgcd(b,a%b,y,x);
        y-=a/b*x;
        return q;
    }
    
    int main()
    {
        scanf("%lld%lld",&n,&m);
        ll z=gcd(n,m);
        n/=z,m/=z;
        ll x,y;
        ll asd=exgcd(n,m,x,y);
        printf("%lld",(x+m)%m);
    }
  • 相关阅读:
    Windows更改默认RDP端口
    npm
    virtbuilder、oz
    brctl 详细使用
    Linux 精心设计的操作
    Oracle 11.2.0.1.0 CRS4639: Could not contact Oracle High Availability Services
    Oracle 11g 数据库启动时实例恢复的背后
    RHEL Debian Repository Configuration
    C#编码规范2
    .net二维码图片生成,并在中间添加LOGO,附base64图片下载功能
  • 原文地址:https://www.cnblogs.com/rir1715/p/7745110.html
Copyright © 2020-2023  润新知