如下,第一份代码就是普通地把递归改成循环,而第二份代码求系数的顺序与一相反,但两种答案都是对的,求第二种方法的正确性。
两份代码的区别就是 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 系数(答案)的范围怎么求,感觉很迷/yun