求a/b的mod 等价于a*b逆的mod

求1到n的逆元可以用线性法

1 int ins[N];
2 int main() {
3     int n, p;
4     cin >> n >> p;
5     for (int i = 2; i <= n; ++i) {
6         ins[i] = (p - p / i) * ins[p % i] % p;
7     }
8     return 0;
9 }

求不连续的数组逆元

 1 const int N = 1e6 + 20;
 2 int ins[N];
 3 int a[N];
 4 int s[N];
 5 int t[N];
 6 int ans[N];
 7 int exgcd(int a, int b, int& x, int& y) {
 8     if (b == 0) {
 9         x = 1;
10         y = 0;
11         return a;
12     }
13     int d = exgcd(b, a % b, y, x);
14     y -= (a / b) * x;
15     return d;
16 }
17 int main() {
18     int n, p;
19     cin >> n >> p;
20     for (int i = 1; i <= n; ++i) {
21         cin >> a[i];
22     }
23     s[0] = 1;
24     for (int i = 1; i <= n; ++i) {
25         s[i] = a[i] * s[i - 1]%p;
26     }
27     int x, y;
28     int d=exgcd(s[n], p, x, y);
29     x = (x % p + p) % p;
30     t[n] = x;
31     ans[n] = t[n] * s[n - 1] % p;
32     for (int i = n - 1; i >= 1; --i) {
33         t[i] = t[i + 1] * a[i + 1]%p;
34         ans[i] = t[i] * s[i - 1]%p;
35     }
36     for (int i = 1; i <= n; ++i) {
37         cout << ans[i] << ' ';
38     }
39     return 0;
40 }

欧拉函数表示与x互质的数目

 1 bool b[N];
 2 int prime[N];
 3 int cnt = 0;
 4 int phi[N];
 5 int euler(int n) {
 6     for (int i = 2; i <= n; ++i) {
 7         if (!b[i]) {
 8             prime[++cnt] = i;
 9             phi[i] = i - 1;
10         }
11         for (int j = 1; j <= cnt && prime[j] * i <= n; ++j) {
12             b[prime[j] * i] = true;
13             if (i % prime[j] == 0) {
14                 phi[prime[j] * i] = phi[i] * prime[j];
15                 break;
16             }
17             else {
18                 phi[i * prime[j]] = phi[i] * phi[prime[j]];
19             }
20         }
21     }
22 }

中国剩余定理x==a[i](modm[i]) 一系列同余方程组

解法是不断合并方程组

 1 void merge(int& a, int& b, int c, int d) {
 2     int x, y;
 3     int g = exgcd(b, d, x, y);
 4     d /= g;
 5     x = (x * ((c - a) / g) % d + d) % d;
 6     a += b * x;
 7     b *= d;
 8 }
 9 int main() {
10     int a = 0, b = 1;//开局赋值0与1;
11     int n;
12     cin >> n;
13     for (int i = 1; i <= n; ++i) {
14         int c, d;
15         cin >> c >> d;
16         merge(a, b, c, d);
17     }
18     cout << a << endl;
19     return 0;
20 }