• [NOIP2012]同余方程


    【NOIP 2012 提高组 第二天 第一题】

    【题目描述】

    求关于 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。 

    【思路&知识补充

    ax ≡ 1 (mod b)

    可以写成

    ax+by=1

    运用扩展欧几里得算法,求出一组解。根据所有解的规律:

    x加上b/gcd(a,b),同时y减去a/gcd(a,b)后,仍满足ax+by=c。

    求出x的最小正整数解。

    var a,b,c,x,y:longint;
    
    function gcd(a,b:Longint; var x,y:Longint):longint;//扩展欧几里得定理
    var t:longint;
    begin
        if b=0 then//当b=0时退出,此时a为最大公约数
        begin
            x:=1;
            y:=0;
            exit(a);
        end;
        gcd:=gcd(b,a mod b,x,y);
        t:=x;
        x:=y;
        y:=t-(a div b)*y;
    end;
    
    begin
        read(a,b);
        c:=gcd(a,b,x,y);
        while (x-(b div c)>0) do x:=x-b div c;
        //判断x大小,如果比0大即减(b div c),此时y+(a div c)得数相等
        if x<0 then while x<0 do x:=x+(b div c);
        //判断x小于零,同理加(b div c)
        writeln(x);
    end.
  • 相关阅读:
    ubuntu
    long long 的输入输出问题
    hdu 4135 a到b的范围中多少数与n互质(容斥)
    hdu4757 可持续化01字典树+LCA
    E
    bzoj4260 求两个不相交的区间各自异或后相加的最大值。
    hdu4638 问一段区间能组成多少段连续的数
    hdu4637 计算俩运动对象的时间交
    hdu4632 回文子序列
    hdu4635 有向点双
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4709254.html
Copyright © 2020-2023  润新知