您的位置:首页 > 其它

HDU 1576 (A/B)扩展欧几里德定理

2016-09-11 11:22 513 查看
Time Limit:1000MS     Memory Limit:32768KB     64bit
IO Format:
%I64d & %I64u
HDU
1576

Description

要求(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


      根据扩展欧几里德定理可以得出   形如Ax+By=gcd(A, B)的一组特解

     {

    x0 = x + t * B / gcd(A, B), 

      y0 = y - t * A / gcd(A, B);

    }

   来自百度:扩展欧几里德定理

编辑

对于不完全为 0 的整数 a,b,gcd(a,b)表示 a,b 的最大公约数。那么一定存在整

数 x,y 使得 gcd(a,b)=ax+by。

根据gcd(B, 9973) = 1 可以得出 Bx + 9973y = 1 ;

再根据n = A % 9973, X = A /  B; Y = A / 9973;

n = A - A /9973 * 9973;  n = X * B - Y * 9973;

观察上下两式, 相差一个n; So 最后得到的X只要乘以n然后

   (x * n % Mod + Mod) % Mod ;就ok了;

#include <cstdio>

#include <iostream>

#include <cstring>

#include <algorithm>

#include <map>

using namespace std;

const int inf = 0x3f3f3f3f;

const int N = 100005;

const int Mod = 9973;

typedef long long LL;

 int x, y;

void Extend_gcd(int a, int b)

{

    if(b==0)

    {

        x = 1;

        y = 0;

        return ;

    }

    Extend_gcd(b, a%b);

    int t = x ;

    x = y;

    y = t - (a/b) * y;

}

int main()

{

   int n, B, t;

   scanf("%d", &t);

   while(t--)

   {

       scanf("%d %d", &n, &B);

       Extend_gcd(B, Mod);

       printf("%d\n", (x * n % Mod + Mod) % Mod);

   }

}

7922
6060




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: