码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 1576 A/B 拓展欧几里得算法

时间:2014-10-28 21:23:56      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   io   color   os   java   sp   strong   

A/B

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2390    Accepted Submission(s): 1731


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
 
  对于拓欧我用的一点也不熟练,特别是限制解必须为正数时,而本题规定了b,9973互质,直接取模至正数,还变简单了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long qword;
qword ext_gcd(qword a,qword b,qword &x,qword &y)
{
        if (a%b==0)
        {
                //a*x+b*y==b
                x=0;y=1;
                return y;
        }
        qword ret=ext_gcd(b,a%b,x,y);
        qword tx=x,ty=y;
        x=ty;
        y=tx-a/b*ty;
        return ret;
}
int main()
{
        //freopen("input.txt","r",stdin);
        //A=9973*x+n
        //(9973*x+n)=y*B
        //9973*x-B*y==-n
        qword n,a,b,x,y,yy,xx;
        int nn;
        scanf("%d",&nn);
        qword g;
        while (nn--)
        {
                scanf("%I64d%I64d",&n,&b);
                g=ext_gcd(9973,b,x,y);
                x*=-n;y*=n;
            //    cout<<9973*x-b*y<<endl;
                yy=(y%9973+9973)%9973;
                xx=x-(y-yy)/9973*b;
            //    cout<<9973*xx-b*yy<<endl;
                cout<<yy<<endl;
        }
}

 

hdu 1576 A/B 拓展欧几里得算法

标签:des   style   blog   io   color   os   java   sp   strong   

原文地址:http://www.cnblogs.com/mhy12345/p/4057678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!