给出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
#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;
}
2 3Sample 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;
}