扩欧求逆元:

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int n, b; 6 7 int ex_gcd(int a, int b, int &x, int &y) { 8 if(b == 0) { 9 x = 1, y = 0; 10 return a; 11 } 12 int g = ex_gcd(b, a % b, y, x); 13 y -= a / b * x; 14 return g; 15 } 16 17 int main() { 18 cin >> n >> b; 19 for(int a = 1; a <= n; a++) { 20 int x, y; 21 int g = ex_gcd(a, b, x, y); 22 int t = b / g; 23 x = (x % t + t) % t; 24 printf("%d ", x); 25 } 26 }
线性递推求逆元:

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 const int MAXN = 3000000 + 5; 6 7 int n, p; 8 int iel[MAXN]; 9 10 int main() { 11 iel[1] = 1; 12 scanf("%d%d", &n, &p); 13 for(int i = 2; i <= n; i++) { 14 //被注释掉的写法和程序中的写法是等价的 15 //iel[i] = 1LL * (p - p / i) * iel[p % i] % p; 16 iel[i] = - 1LL * (p / i) * iel[p % i] % p; 17 iel[i] = ((iel[i]) % p + p) % p; 18 } 19 for(int i = 1; i <= n; i++) 20 printf("%d ", iel[i]); 21 } 22 23 线性求逆元
要下晚自习了..证明明天补...