【ZOJ 3609】Modular Inverse 最小乘法逆元

The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1x (mod m). This is equivalent to ax≡1 (mod m).

Input

There are multiple test cases. The first line of input is an integer T ≈ 2000 indicating the number of test cases.

Each test case contains two integers 0 < a ≤ 1000 and 0 < m ≤ 1000.

Output

For each test case, output the smallest positive x. If such x doesn't exist, output "Not Exist".

Sample Input
3
3 11
4 12
5 13
Sample Output
4
Not Exist
8

题解:
最小乘法逆元:由ax≡1 (mod m)得:转化为解线性方程ax+by=1
需要注意的地方:最小解取模时不能写成(x%t+t)%t 因为此题要的是正数解 这样写有时会输出0

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long ll;
 8 ll exgcd(ll a,ll b,ll &x,ll &y)
 9 {
10     if(!b)
11     {
12         x=1;y=0;
13         return a;
14     }
15     ll r=exgcd(b,a%b,x,y);
16     ll t=x;
17     x=y;
18     y=t-a/b*y;
19     return r;
20 }
21 void work(ll a,ll b,ll c)
22 {
23     ll x,y;
24     ll r=exgcd(a,b,x,y);
25     if(c%r!=0){
26         printf("Not Exist\n");
27         return ;
28     }
29     x*=c/r;
30     ll t=b/r;
31     if(t<0)t=-t;
32     x%=t;
33     if(x<=0)x+=t;
34     printf("%lld\n",x);
35 }
36 int main()
37 {
38     int T;
39     ll a,b;
40     scanf("%d",&T);
41     while(T--){
42         scanf("%lld%lld",&a,&b);
43         work(a,b,1);
44     }
45     return 0;
46 } 
 
 

 

 

转载于:https://www.cnblogs.com/Yuzao/p/7029396.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值