给出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,如果有多个满足条件的,输出最小的。
Input示例
2 3
Output示例
2
思路:
拓展欧几里得算法;(欧几里得精彩)//视频讲解欧几里得
核心之处在于它会找到x*m+y*n=gcd(n,m);//但是n和m必须互质才有解;
用欧几里得能找出来x和y 题意是k*m%n==1;(我知道卫聚聚要看我的博客求卫聚聚指出不当之处orz卫聚聚)
可以变成k*m-t*n==1;那么通过对比x*m+y*n=gcd(n,m);因为n和m互质那么gcd(n,m)==1;
发现x就是k;那么我们只需知道x就可以了但是x可能会是负数;所以我们就将他加上n也就是模;这样直到它为正就可以了;
因为x就相当于k;我们将他加上n;它在模n还是一样的结果;
下面附上蒟蒻的代码:
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long getpow(long long res,long long b)
{
long long s=1;
while(b)
{
if(b&1) s=(s*res)%n;
res=(res*res)%n;
b>>=1;
}
return s;
}
int main()
{
cin>>m>>n;
long long c=getpow(m,n-m);
cout<<c<<endl;
return 0;
}