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;
}
相关文章推荐
- hdu_1576_包含数学变形的扩展欧几里得
- hdu 1576 A/B(扩展欧几里得)
- HDU 1576 A/B (扩展欧几里得)
- hdu_1576A/B(扩展欧几里得求逆元)
- hdu 1576 A/B(扩展欧几里得)
- hdu 1576 扩展欧几里得
- HDU 1576 扩展欧几里得
- 扩展欧几里得 以A/B HDU - 1576 为例
- HDU 1576 A/B 扩展欧几里得
- hdu 1576(数论之扩展欧几里得)
- 扩展欧几里得,逆元初识(poj 1061+codeforce 7C line+hdu 1576 A/B)
- 【扩展欧几里得】hdu 1576 A/B
- HDU - 1576 A/B 扩展欧几里得
- hdu 1576A/B(扩展欧几里得)
- HDU - 1576 - A/B (扩展欧几里得定理)
- HDU 1576 A/B 扩展欧几里得
- hdu1576 A/B 扩展欧几里得求逆元
- HDU 1576 A/B (扩展欧几里得)
- hdu 1576 扩展欧几里得
- HDU - 1576 A / B(扩展欧几里得)