天天看點

HDU1576-A/B(乘法逆元+exgcd) A/B

A/B

                                                                             Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

                                                                                                        Total Submission(s): 4535    Accepted Submission(s): 3525

Problem 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
        

  Author xhd   Source HDU 2007-1 Programming Contest

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

#define ll long long
#define mod 9973

ll extend_gcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1,y=0;
        return a;
    }
    ll gcd=extend_gcd(b,a%b,x,y);
    ll tmp=x;
    x=y;
    y=tmp-(a/b)*y;
    return gcd;
}

int main()
{
    int t;
    ll b,n,x,y;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld %lld",&n,&b);
        ll d=extend_gcd(b,mod,x,y);
        x=(x%mod+mod)%mod;
        ll ans=n*x%mod;
        printf("%lld\n",ans);
    }
    return 0;
}