51Nod-1256-乘法逆元

来源:互联网 发布:淘宝价格监控软件 编辑:程序博客网 时间:2024/04/29 13:40

ACM模版

描述

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

题解

求乘法逆元方法有很多种,参考《求逆元》中的方法,合适的只有第一种,使用扩展GCD来做,第二种简洁写法和第三种欧拉函数解法都会报Runtime error,原因大概是会数据溢出,反正不是爆栈,因为手动加栈后依然WA。

代码

#include <iostream>using namespace std;/* *  扩展欧几里得法(求ax + by = gcd) *///  返回d = gcd(a, b);和对应于等式ax + by = d中的x、ylong long extendGcd(long long a, long long b, long long &x, long long &y){    if (a == 0 && b == 0)    {        return -1;  //  无最大公约数    }    if (b == 0)    {        x = 1;        y = 0;        return a;    }    long long d = extendGcd(b, a % b, y, x);    y -= a / b * x;    return d;}//  求逆元 ax = 1(mod n)long long modReverse(long long a, long long n){    long long x, y;    long long d = extendGcd(a, n, x, y);    if (d == 1)    {        return (x % n + n) % n;    }    else    {        return -1;  //  无逆元    }}int main(int argc, const char * argv[]){    long long M, N;    while (cin >> M >> N)    {        cout << modReverse(M, N) << '\n';    }    return 0;}

参考

求逆元
解决爆栈,手动加栈

0 0
原创粉丝点击