[ACM_其他] Modular Inverse [a关于模m的逆 模线性方程]

简介:


 

Description

The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1x (mod m). This is equivalent toax≡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

 

题目大意:求a关于模m的逆。

解题思路:1>扩展欧几里得算法:找出一对整数对(x,y),使得ax+by=gcd(a,b).

     2>设a,b,c为任意整数.若方程ax+by=c的一组整数解为(x,y),则它的任意解为(x+k*b',y+k*a'),其中a'=a/gcd(a,b),b'=b/gcd(a,b),k任意整数.

     3>模线性方程:输入正整数:a,b,n,解方程ax≡b(mod n)即:a-b是n的整数倍即:ax-b=ny.

         4>ax≡1 (mod m)等价于:ax%m==1%m 也等价于:ax-my=1是否有整数解且求出满足条件的最小整数x。扩展欧几里得算法1必须是gcd(a,m)的倍数,所以a和n互素即:gcd(a,m)=1才会有解,在该条件下有唯一解。

 

复制代码
 1 #include<iostream>
 2 #include<string.h>
 3 #include<cstring>
 4 #include<string>
 5 using namespace std;
 6 void gcd(int a,int b,int& d,int& x,int& y){
 7     if(!b){
 8         d=a;x=1;y=0;
 9     }else{
10         gcd(b,a%b,d,y,x);
11         y-=x*(a/b);
12     }
13 }//扩展欧几里得算法,a,b,是输入量
14 //d为gcd(a,b),x,y为ax+by=gcd(a,b)的一组整数解
15 int main(){
16     int T;cin>>T;
17     while(T--){
18         int a,m,d,x,y;
19         cin>>a>>m;
20         gcd(a,m,d,x,y);
21         if(d!=1)cout<<"Not Exist\n";
22         else{//根据一组解求满足条件的x
23             if(x>0){
24                 while(x>0)x-=m;
25                 x+=m;
26             }else if(x<0){
27                 while(x<0)x+=m;
28             }else x+=m;
29             cout<<x<<'\n';
30         }
31     }return 0;
32 }
复制代码
相关文章
Julia 复数和有理数
在 Julia 中,预定义的复数和有理数类型支持多种数学运算。复数以 `a+bi` 形式表示,其中 `a` 是实部,`b` 是虚部,`i` 是虚数单位。全局常量 `im` 等于 `-1` 的平方根,简化了复数的书写。例如,`1+2im` 是一个复数。可以进行加、减、乘、除和幂运算,如 `(1 + 2im)^2.5` 结果是 `-3 - 4im`。有理数未在此摘要中提及。
|
6月前
|
存储 算法 数据挖掘
常闲算术成算法-accumulat讲解
常闲算术成算法-accumulat讲解
81 0
|
Android开发 iOS开发
Cellular Matrix 蜂窝矩阵(一)
最近的新项目要在兴趣选择的标签上做一些文章,看了一些国内需要兴趣选择的APP的样式,基本都是不规则的横向排列标签选择模式,基本都是用`CollectionView`配合着自己重新写的`FLowLayout`进行重新的布局排布。然而,虎嗅APP的兴趣选择标签的样式倒是很独特,用了一种类似蜂窝样式的排布来进行选择,同时还配合动画效果,进一步的提升了用户的体验感受。但是只是在安卓版本的虎嗅APP才有,iOS版本的并没有体验到。
|
安全
分子构象Molecular Conformation
分子构象(Molecular Conformation),也称分子构型,是指分子在空间中的排列方式和形态。分子构象的不同可以导致分子在物理、化学和生物学等方面表现出不同的性质和行为,因此分子构象的研究对于理解和预测分子性质和行为具有重要意义。
282 1
|
算法
基于simulink的PN码伪码匹配的同步仿真,包括解调,伪码匹配,fft等模块
基于simulink的PN码伪码匹配的同步仿真,包括解调,伪码匹配,fft等模块
160 0
基于simulink的PN码伪码匹配的同步仿真,包括解调,伪码匹配,fft等模块
|
机器学习/深度学习
Julia:用多层感知机解决异或问题
异或问题就是当两个输入的布尔值不一致时,输出为 True(可以用 1 代表),如果两个输入的布尔值一致的时候,输出为 False(可以用 0 代表)。
238 0
|
算法
【欧拉计划第 12 题】 高度可除的三角数 Highly divisible triangular number
【欧拉计划第 12 题】 高度可除的三角数 Highly divisible triangular number
121 0
【欧拉计划第 12 题】 高度可除的三角数 Highly divisible triangular number
|
算法
F#实现Simpson's Rule求数值积分
我们知道,微积分的求值是比较复杂的。一般来说,求积分有定积分和不定积分之分。不定积分需要求出具体的表达式,但被积函数非常复杂时,求解非常费劲,非常可能找不到原函数。而定积分给定了区间范围,可以利用数值方法,利用F#实现对积分的数值计算。
1060 0
F#实现Simpson's Rule求数值积分
Julia实现克莱姆法则求解线性方程组
在实际应用中,有时候我们需要求解一组方程。一般来说,基于线性方程组的解空间理论,线性方程组有唯一解当且仅当有效方程数等于未知数的个数。这时,可以运用多种方法来求出唯一的解。而克莱姆法则(Cramer's Rule)就是一种求解线性方程组的方法。利用Julia可以非常方便的求解方程组的解,只需3行代码。
1683 0
Julia实现克莱姆法则求解线性方程组