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

来源:互联网 发布:淘宝物流评分怎么提升 编辑:程序博客网 时间:2024/06/04 17:44

A/B

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


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
21000 5387 123456789
 

Sample Output
79226060

这个题是用扩展欧几里得算法----xa+yb=gcd(a,b);此题中:B*x+9973*y=gcd(B, 9973)=1;可以求出x,y的一组解;

由题目知:n=A%9973=A-9973*k;   

设A/B=m, A=B*m; n=B*m-9973*k;   则B*m/n-9973*k/n=1; 由扩展欧几里得算法可以解出m/n;因为m/n可能为负,所以需要转化一下m/n=(m/n%9973+9973)%9973;

(A/B)%9973=m%9973=(m/n%9973+9973)%9973;

如果想深入了解扩展欧几里得算法请戳这里

代码附上:

using namespace std;int exgcd(int a, int b, int &x, int &y){    if(b==0){        x=1;        y=0;        return a;    }    int r=exgcd(b, a%b, x, y);    int t=x;    x=y;    y=t-(a/b)*y;    return r;}int main(){    int T;    cin >> T;    while(T--){        int n, B;        cin >> n >> B;        int tem=9973;        int x, y;        int r=exgcd(B, tem, x, y);        int K=(x%tem+tem)*n%9973;        cout << K << endl;    }    return 0;}






原创粉丝点击