求助exgcd乘法逆元
查看原帖
求助exgcd乘法逆元
404961
baiABCiBaraki545楼主2021/10/7 13:56

如下,第一份代码就是普通地把递归改成循环,而第二份代码求系数的顺序与一相反,但两种答案都是对的,求第二种方法的正确性。

两份代码的区别就是 inv 函数中的 stack

#include <bits/stdc++.h>
using namespace std;
int inv(int a, int b)
{
    stack <int> s;
    while(b)
    {
        s.push(a/b);
        a %= b;
        swap(a, b);
    }
    int x = 1, y = 0;
    while(!s.empty())
    {
        swap(x, y);
        y -= s.top()*x;
        s.pop();
    }
    return x;
}
int main()
{
    int n, p;
    cin >> n >> p;
    for(int i = 1; i <= n; ++i)
        cout << (inv(i, p)%p+p)%p << endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int inv(int a, int b) 
{
    int x = 1, y = 0;
    while (b) 
    {
        swap(x, y);
        y -= x * (a/b);
        a %= b;
        swap(a, b);
    }
    return x;
}
int main()
{
    int n, p;
    cin >> n >> p;
    for (int i = 1; i <= n; i++)
        printf("%d\n", (inv(i,p)%p+p) % p);
    return 0;
}

还有就是 exgcd\operatorname{exgcd} 系数(答案)的范围怎么求,感觉很迷/yun

2021/10/7 13:56
加载中...