hdu 1576 求逆元
题意:给出n=A mod 9973和B,求(A/B) mod 9973
昨天用扩展欧几里得做过这题,其实用逆元也可以做。
逆元的定义:例如a*b≡1 (mod m),则b就是a关于m的逆元。
求逆元方法也很简单,用扩展欧几里得解这个方程即可。
逆元性质:若a是b的逆元,则(x/a)mod p=(x*b)mod p
对于本题呢?设B的逆元为x,
那么有(A/B) mod 9973=((A mod 9973)*(x mod 9973))mod 9973
Reference: http://blog.csdn.net/leonharetd/article/details/13095191
1 #include <iostream> 2 using namespace std; 3 __int64 a,b,b1,x,k,tm,r,T,n,ans; 4 5 __int64 extend_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y) 6 { 7 if (b==0) 8 { 9 x=1; 10 y=0; 11 return a; 12 } 13 else 14 { 15 __int64 r=extend_gcd(b,a%b,y,x); 16 y=y-x*(a/b); 17 return r; 18 } 19 } 20 21 int gcd(int a,int b) 22 { 23 if (b==0) return a; 24 return gcd(b,a%b); 25 } 26 27 int main() 28 { 29 cin>>T; 30 while (T--) 31 { 32 cin>>n>>b; 33 //bx==1 (mod m) 34 tm=extend_gcd(b,9973,x,k); 35 b1=x*(1/tm); 36 r=9973/tm; 37 b1=(b1%r+r)%r; //求出最小非负整数解 38 ans=(n*(b1%9973))%9973; 39 cout<<ans<<endl; 40 41 } 42 return 0; 43 }
posted on 2014-11-03 13:16 Pentium.Labs 阅读(262) 评论(0) 编辑 收藏 举报