zoukankan      html  css  js  c++  java
  • 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,如果有多个满足条件的,输出最小的。
    Sample Input
    2 3
    Sample Output
    2

    思路:由于M和N不一定是质数,故不能用费马小定理,应用扩展欧几里得算法。K*M%N=1,求K即求出M对于N的乘法逆元。

    代码:

    #include <iostream>
    using namespace std;
    typedef long long ll;
    int exgcd(int a,int b,int &x,int &y)
    {
    	if(b==0)
    	{
    		x=1;
    		y=0;
    		return a;
    	}
    	else
    	{
    		int r=exgcd(b,a%b,x,y);
    		int t=x;
    		x=y;
    		y=t-(a/b)*x;
    		return r;//r为ab最大公约数 
    	}
    }
    int main()
    {
    	int m,n,x,y;
    	cin>>m>>n;
    	exgcd(m,n,x,y);
    	while(x<0)
    	{
    		x+=n;//若得到的x小于0,则应使其加n,直到x>0. 
    	}
    	cout<<x<<endl;
    	return 0; 
    }
  • 相关阅读:
    第一篇正式文章 随便聊聊吧
    CSS 28 块之间的空格
    CSS 27 贴在下方
    CSS 26 左右固定
    CSS 25 垂直居中
    CSS 24 左侧固定
    CSS 23 水平居中
    CSS 22 显示方式
    CSS 21 浮动
    CSS 20 相对定位
  • 原文地址:https://www.cnblogs.com/cnlik/p/11851890.html
Copyright © 2011-2022 走看看