码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1576 求逆元

时间:2014-11-03 14:32:11      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   sp   strong   

题意:给出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 }

 

hdu 1576 求逆元

标签:style   blog   http   io   color   ar   os   sp   strong   

原文地址:http://www.cnblogs.com/pdev/p/4070972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!