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)。
每组数据有两个数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 }