1256 乘法逆元
基准时间限制:1 秒 空间限制:131072 KB 分值: 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
思路:K * M % N = 1等价于 K*M=N*X+1 即 K*M+N*(-X)=1
根据扩展欧几里德算法,求出K和(-X);
而K是应为正整数,即需要若K为负整数,则需要将之化正,即与负数取模同理,将K加上N,直至K>0为止,所得的数即为最小的乘法逆元;
若K为正整数,则直接输出即可
#include<stdio.h> int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int r=exgcd(b,a%b,x,y); int t=x;x=y;y=t-(a/b)*y; return r; } int main(){ int n,m,x,y; while(~scanf("%d%d",&m,&n)){ exgcd(m,n,x,y); while(x<0) x+=n; printf("%d ",x); } }
参考博客:http://blog.csdn.net/qq_16830983/article/details/44889333