HDU1576(欧几里得算法)

Problem Descption

要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。

Input

数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。

Output

对应每组数据输出(A/B)%9973。

Sample Input

2
1000 53
87 123456789

Sample Output

7922
6060

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576

问题分析:

设x=(A/B)%9973,则9973k+x=A/B,得A=9973Bk+xB。

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

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

AC代码:


#include<iostream>

long ojld(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);

        ojld(b, a, &x, &y);

        x = (x + a) % a;        // x有可能为负,需要调整

        printf("%ld\n", x*n%a);

    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43966635/article/details/86685237