zoukankan      html  css  js  c++  java
  • HDU1576 A/B【扩展欧几里得算法】

    问题链接HDU1576 A/B

    问题简述:参见上述链接。

    问题分析这个问题可以用解整数的不定方程来解决,即使用扩展欧几里德算法。

    根据题意,输入的n=A%9973(没有输入A),A%B=0(A必能被B整除),B与9973互素(GCD(B,9973)=1)。

    解题过程首先是建立方程,然后才能编写程序。

    设x=(A/B)%9973(x是最终想计算的值),则9973k+x=A/B(k为整数),得A=9973Bk+xB。

    因为n=A%9973与A=9973Bk+xB,所以xB%9973=n,得xB=n+9973y。

    故:(x/n)B+(-y/n)9973=1=GCD(B,9973),该方程有解。

    要求x和y,先求X=x/n和Y=-y/n,即先解方程BX+9973Y=1。

    最后,x=X*n。

    需要注意的是,求得的x有可能是负值,需要进行调整。

    不过,这个计算方法好像比较花时间。

    程序说明:(略)。


    AC的C语言程序如下:

    #include <stdio.h>
    
    // 递推法实现扩展欧几里德算法
    long exgcd(long a, long b, long *x, long *y)
    {
        long x0=1, y0=0, x1=0, y1=1;
        long r, q;
        *x=0;
        *y=1;
    
        r = a % b;
        q = (a - r) / b;
        while(r)
        {
            *x = x0 - q * x1;
            *y = y0 - q * y1;
            x0 = x1;
            y0 = y1;
            x1 = *x;
            y1 = *y;
    
            a = b;
            b = r;
            r = a % b;
            q = (a - r) / b;
        }
        return b;
    }
    
    int main(void)
    {
        int t, i;
        long n, b, a=9973, x, y;
    
        scanf("%d", &t);
        for(i=0; i<t; i++) {
            scanf("%ld%ld", &n, &b);
            exgcd(b, a, &x, &y);
            x = (x + a) % a;        // x有可能为负,需要调整
            printf("%ld
    ", x*n%a);
        }
    
        return 0;
    }


  • 相关阅读:
    Python有哪些华而不实的技巧?
    json:dumps/loads & pickl
    json模块与第三方模块的引入
    os 及 sys 模块补充
    如何白嫖视频会员
    python和SAS的思考
    5、根据进程号PID查询其服务路径
    5、安装mongodb 异常
    2、shell 判断字符串是否包含另一个字符串
    【九校2D2T1】旋转子段
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564931.html
Copyright © 2011-2022 走看看