【hdu 1576】A/B(数论--拓展欧几里德 求逆元 模版题)

题意:给出 A%9973 和 B,求(A/B)%9973的值。

解法:拓展欧几里德求逆元。由于同余的性质只有在 * 和 + 的情况下一直成立,我们要把 /B 转化为 *B-1,也就是求逆元。

   对于 B-1,P为模数9973,那么 B*B-1=1(mod P)  →  把 B-1 看成 x ,就是 Bx+Py=1。也就是求不定方程的解了。x 就是 B-1,答案就是 ((A%9973)*(x%9973))%9973 。

P.S.关于拓展欧几里德求解不定方程的具体解释请见——【poj 2115】C Looooops(数论--拓展欧几里德 求解同余方程 模版题)

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 #define N 10000
 7 #define B (int)1e9+10
 8 #define mod 9973
 9 typedef long long LL;
10 
11 LL mabs(LL x) {return x>0?x:-x;}
12 LL exgcd(LL a,LL b,LL& x,LL& y)
13 {
14     if (!b) {x=1,y=0; return a;}
15     LL d,tx,ty;
16     d=exgcd(b,a%b,tx,ty);
17     x=ty,y=tx-(a/b)*ty;
18     return d;
19 }
20 int main()
21 {
22     int T; LL n,m;
23     scanf("%d",&T);
24     while (T--)
25     {
26       scanf("%lld%lld",&n,&m);
27       LL d,x,y,t;
28       d=exgcd(m,mod,x,y);
29       x%=mod;//其实,若d!=1,就无解了。
30       
31       t=mabs(mod/d);
32       x=(x%t+t)%t;//最小非负整数解
33       
34       printf("%lld\n",(n*x)%mod);
35     }
36     return 0;
37 }

 

posted @ 2016-11-15 21:33  konjac蒟蒻  阅读(236)  评论(0编辑  收藏  举报