> [表达整数的奇怪方式](找不到页面 - AcWing)
```
#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int N = 30;
int m[N], a[N];
int n;
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1, y = 0;
return a;
}
int d = exgcd (b, a % b, y, x);
y = y - a / b * x;
return d;
}
int excrt()
{
int m1 = m[0], a1 = a[0];
for (int i = 1; i < n; i ++)
{
int k1, k2;
int d = exgcd(a1, a[i], k1, k2);//用扩展欧几里得算法求得是k1*a1 - k2*a2 = gcd(a1, a2)的后面要成(m2 - m1) / gcd(a1, a2)
if ((m[i] - m1) % d) return -1;
k1 *= (m[i] - m1) / d;
//由于x0 = k1 * a1 + m1 = k2 * a2 + m2所以只需要求一个即可, 因为要求最小正整数所以a2 / d要保证取正数
int t = abs(a[i] / d);//要取最小的那个A
k1 = (k1 % t + t) % t;//这样取最小的一个
m1 = k1 * a1 + m1;
a1 = abs(a1 * a[i] / d);
}
return (m1 % a1 + a1) % a1;
}
signed main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++)
scanf("%d%d", &a[i], &m[i]);
printf("%lld", excrt());
return 0;
}
```