HDU1576 A/B

来源:互联网 发布:javascript toast 编辑:程序博客网 时间:2024/05/17 03:38

题目:
http://acm.split.hdu.edu.cn/showproblem.php?pid=1576
分析:
我们有 A/B ≡ x (mod9973)
即 A/B = 9973*y + x
即 A = 9973*B*y + B*x
即 A%9973 = (B*x) %9973 = n
即 B*x ≡ n (mod9973)
即 B*x + 9973*y = n
这就化简为一个模线性方程ax+by=c的形式了,其中a=B,b=9973,c=n
解得x即可
代码:

#include <cstdio>#include <algorithm>#include <cstring>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 r=exgcd(b,a%b,y,x);    y-=x*(a/b);    return r;}int main(){    int T;    long long t,a,b,c,gcd,x,y,n,B;    scanf("%d",&T);    while(T--)    {        scanf("%I64d%I64d",&n,&B);        a=B;        b=9973;        c=n;        gcd=exgcd(a,b,x,y);        x*=c/gcd;        t=b/gcd;        if(x>=0) x%=t;        else x=x%t+t;        printf("%I64d\n",x);     }    return 0;}
原创粉丝点击