给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。
Input输入2个数M, N中间用空格分隔(1 <= M < N <= 10^9)Output输出一个数K,满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。Sample Input
2 3
Sample Output
2
下面用扩展欧几里得的方法求解
#include<iostream>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
void ex_gcd(int a, int b, int &x, int &y, int &d){
if (!b)
{
d = a;
x = 1,
y = 0;
}
else{
ex_gcd(b, a % b, y, x, d);//这里一定要转换;递归的思想
y =y- x * (a / b);
}
}
int inv(int t, int p){//如果不存在,返回-1
int d, x, y;
ex_gcd(t, p, x, y, d);
return d == 1 ? (x % p + p) % p : -1;
}
int main(){
int a, p;
cin>>a>>p;
cout<<inv(a,p)<<endl;
}
#include<iostream>
using namespace std;
int e(int a,int m,int &x,int &y)//这里一定要取址,这也是我对用编程语言解决未知数的思路,get到了。
{
if(!m)
{
x=1;
y=0;
return a;
}
int d=e(m,a%m,x,y);
int t=x;
x=y;
y=t-(a/m)*y;
return d;
}
int ans(int m,int n)
{
int x,y,d;
d=e(m,n,x,y);
if(d==1)
{
while(x<=0)//这里直接用return (x%n+n)%n为的是解决负数问题,还有可能是求最小值的关键;
x+=n;
return x;
}
else
return -1;
}
int main()
{
int n,m;
cin>>m>>n;
cout<<ans(m,n)<<endl;
}
这是费马小定理的解法,但是需要注意的是费马小定理要求mod的数是素数因此需要加欧拉函数这就是欧拉费马定理
#include <iostream>
#include <algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;//这个方法很容易就超界,要用longlong
ll pow_mod(ll a,ll p2,ll p)
{
ll ans=1;
while(p2)
{
if(p2&1)
ans=(ans*a)%p;
p2>>=1;
a=(a*a)%p;
}
return ans;
}
ll oula(ll a)
{
ll ans=a;
for(ll i=2;i*i<=a;i++)
if(a%i==0)
{
ans=(ans/i)*(i-1);
while(a%i==0)
a/=i;
}
if(a>1)
ans=(ans/a)*(a-1);
return ans;
}
int main()
{
ll m,n;
cin>>m>>n;
ll k=oula(n);
cout<<pow_mod(m,k-1,n)%n<<endl;//这里要mod一下n保证结果是最小的
return 0;
}
#include<iostream>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
LL d;
int ex_gcd(int a, int b, int &x, int &y){
if (!b)
{
// d = a;
x = 1,
y = 0;
return a;
}
else{
int tx;
int ty;
d=ex_gcd(b, a % b, tx, ty);//这里一定要转换;递归的思想
x=ty;
y=tx-(a/b)*ty;
}
return d;
}
int inv(int t, int p){//如果不存在,返回-1
int x, y;
// int d;
ex_gcd(t, p, x, y);
return d == 1 ? (x % p + p) % p : -1;
}
int main(){
int a, p;
cin>>a>>p;
cout<<inv(a,p)<<endl;
return 0;
}