Hdu--1576(数论,拓展欧几里得)

2014-08-31 16:58:59

A/B

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


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
 
 
 
思路:首先根据条件:n = A % 9973 , 设A = Bx。所以:n = Bx - A / 9973 * 9973 , 建立线性方程:Bx1 + 9973y1 = gcd(B,9973) = 1,求解出x1和y1后,对方程两边各乘 n,方程变为:Bnx1 + 9973ny1 = n,令x = nx1 , y = -ny1。最后 x += 9973 一直处理到 > 0。
 1 /*************************************************************************
 2     > File Name: hdu1576.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sun 31 Aug 2014 04:20:57 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 
16 int Ex_gcd(int a,int b,int &x,int &y){
17     if(b == 0){
18         x = 1;
19         y = 0;
20         return a;
21     }
22     int r = Ex_gcd(b,a % b,x,y);
23     int t = x;
24     x = y;
25     y = t - a / b * y;
26     return r;
27 }
28 
29 int T,n,B;
30 
31 int main(){
32     int x,y,d;
33     scanf("%d",&T);
34     while(T--){
35         scanf("%d%d",&n,&B);
36         //Bx1 + 9973y1 = gcd(B,9973) = 1
37         d = Ex_gcd(B,9973,x,y);
38         x *= n;
39         while(x < 0) x += 9973;
40         printf("%d\n",x);
41     }
42     return 0;
43 }

 

 

 

posted @ 2014-08-31 17:14  Naturain  阅读(124)  评论(0编辑  收藏  举报