51nod 1256 乘法逆元

给出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;
}

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试