2
1000 53
87 123456789
7922
6060
/* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:HDU.cpp *作 者:单昕昕 *完成日期:2015年3月2日 *版 本 号:v1.0 */ //AC代码1 #include<iostream> 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 b,x,y,t,n; cin>>t; while(t--) { cin>>n>>b; exGcd(b,9973,x,y); x=x*n; x=(x%9973+9973)%9973; cout<<x<<endl; } } //AC代码2 #include<iostream> #include<cmath> 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 b,x,y,t,n; cin>>t; while(t--) { cin>>n>>b; exGcd(b,9973,x,y); x*=n; x%=9973; x=9973-fabs(x); cout<<x<<endl; } }
拓展欧几里得算法。
乘法逆元。
学习心得:
研究了一个多小时才看懂拓展欧几里得算法怎么用。
n = A%9973, 设A / 9973 = y;
A / B = x 得 A = B * x;
有: B*x - 9973 * y = n;
由n=A%9973,得A=n+y*9973,即n=A-9973y;
又由扩展欧几里得公式得:ax+by=gcd(a,b);
由A必能被B整除,即A%B==0,所以设A/B=X,A=B*X,得n=Bx-9973y。