51nod 1256 乘法逆元

16 篇文章 0 订阅
16 篇文章 0 订阅

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值