hdu 1576 A/B



http://acm.hdu.edu.cn/showproblem.php?pid=1576

hdu 1576 A/B_第1张图片

此题是裸扩展gcd

设A/B=x;

A%9973=n即 A = 9973*k + n 即B*x-9973*k=n 一个基本的同余方程,利用扩展gcd求解x即可。

#include 
#include 
#include 
#include 

using namespace std;

long long exGcd(long long a, long long b, long long &x, long long &y){
    if(b == 0){
        x = 1;
        y = 0;
        return a;
    }
    long long gcd = exGcd(b, a%b, y, x);
    y -= (a/b) * x;
    return gcd;
}

int main(){
    int cas;
    scanf("%d",&cas);
    while(cas--){
        int n,B;
        scanf("%d%d",&n,&B);
        long long a = B, b = -9973, c = n,x,y;
        long long gcd = exGcd(a,b,x,y);
        if(c % gcd) continue;///证明没有解
        x *= c / gcd;///求出一个特解
        if(b / gcd < 0) b = -b;
        x %= b / gcd;///利用特解求出通解x + t*(b/gcd)
        if(x < 0)   x += b/gcd;///保证解是整数
        printf("%d\n",x % 9973);
    }
    //system("pause");
    return 0;
}

你可能感兴趣的:(数论)