HDU 1576 A/B (扩展欧几里得)

转载请注明出处忆梦http://blog.csdn.net/yimeng2013/article/details/11822115


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

题解: 由题意有:
①gcd(B,9973) = 1) ,B和9973互质。 
A必能被B整除→A=B*x  ……①式
③n=A%9973→A = n + 9973*y ……
①式和式有 B*x = n + 9973*y 得出 B*x - 9973*y = n  满足扩展欧几里得定理
B*x + 9973*y = gcd(B,9973)   (gcd(B,9973) = 1)这里相当于y取原始式的负值
从而得到所求的式子为 B*x + 9973*y = 1  其中的x即为 A/B

//回归数论第一题


#include<cstdio>  
#include<cstring>  
#define m 9973  
int x, y;  
int gcd(int a,int b)  
{// x,y用全局变量保存  
    int t,d;  
    if(b==0)  
    {  
        x=1;  
        y=0;     
        return a;  
    }  
    d=gcd(b,a%b);  
    t=x;  
    x=y;  
    y=t-(a/b)*y;    
    return d;  
}  
  
int main ()  
{  
    int T;  
    scanf("%d", &T);  
    while(T--)  
    {  
        int n, b;  
        scanf("%d %d", &n, &b);  
        int d = gcd(b,m);  //b,m互质  d 其实就等于1  
        x = x * n/d % m;  //因为求的是B*x+9973*y=1,所以要乘以n。这里也可以写为x = x * n % m; 因为d = 1
        if(x<0)  x=x+9973; //防止x为负数  
  
        printf("%d\n",x%m);  
    }  
    return 0;  
}  



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