扩展欧几里得求逆元中的问题

在扩展欧几里得求逆元的时候,最后一步x = (x%p + p) % p;是怎么来的
#include
#include
#include
using namespace std;
long long x, y, n,p;//最好定全局变量
inline void exgcd(long long a, long long b)
{
if (b == 0) //当b=0时就是遇到了特解,可以递归回去算答案了
{
x = 1, y = 0;
return;
}
exgcd(b, a%b);
long long k;
k = x;
x = y;
y = k - (a / b)*y;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> p;
for (long long i = 1; i <= n; i++) {
exgcd(i, p);
x = (x%p + p) % p;
cout << x << endl;
}
return 0;
}