您的位置:首页 > 其它

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

2017-09-25 17:28 274 查看

A/B

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 6682    Accepted Submission(s): 5299


[align=left]Problem Description[/align]
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
 

[align=left]Input[/align]
数据的第一行是一个T,表示有T组数据。

每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
 

[align=left]Output[/align]
对应每组数据输出(A/B)%9973。
 

[align=left]Sample Input[/align]

2
1000 53
87 123456789

 

[align=left]Sample Output[/align]

7922
6060

这个题是用扩展欧几里得算法----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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: