一、m[]两两互质时
简单证明:
必要时数据类型改为long long
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <numeric>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <utility>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int MAXN = 100100;
const int MOD7 = 1000000007;
const int MOD9 = 1000000009;
const int INF = 2000000000;//0x7fffffff
const double EPS = 1e-9;
const double PI = 3.14159265358979;
const int dir_4r[] = { -1, 1, 0, 0 };
const int dir_4c[] = { 0, 0, -1, 1 };
const int dir_8r[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
const int dir_8c[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int exGCD(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int xx, yy;
int gcd = exGCD(b, a%b, xx, yy);
x = yy;
y = xx - a / b * yy;
return gcd;
}
//求x≡a[](mod m[]) m[]要求两两互质
int CRT(int *a, int *m, int n) {
int M = 1;
int ans = 0;
for (int i = 0; i < n; ++i)
M *= m[i];
for (int i = 0; i < n; ++i) {
int x, y;
int Mi = M / m[i];
exGCD(Mi, m[i], x, y);
ans = (ans + Mi * x * a[i]) % M;
}
if (ans < 0)
ans += M;
return ans;
}
int main() {
return 0;
}
二、m[]不两两互质时
简单证明:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <numeric>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <utility>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int MAXN = 100100;
const int MOD7 = 1000000007;
const int MOD9 = 1000000009;
const int INF = 2000000000;//0x7fffffff
const double EPS = 1e-9;
const double PI = 3.14159265358979;
const int dir_4r[] = { -1, 1, 0, 0 };
const int dir_4c[] = { 0, 0, -1, 1 };
const int dir_8r[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
const int dir_8c[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int exGCD(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int xx, yy;
int gcd = exGCD(b, a%b, xx, yy);
x = yy;
y = xx - a / b * yy;
return gcd;
}
bool merge(int a1, int m1, int a2, int m2, int &a3, int &m3) {
int x, y;
int gcd = exGCD(m1, m2, x, y);
int c = a2 - a1;
if (c % gcd)
return false;
int k = c / gcd;
int s = m2 / gcd;
x = ((k * x) % s + s) % s;
a3 = a1 + x * m1;
m3 = m1 * m2 / gcd;
return true;
}
//求x≡a[](mod m[])
int CRT(int *a, int *m, int n) {
int a1 = a[0];
int m1 = m[0];
for (int i = 1; i < n; ++i) {
int a2 = a[i];
int m2 = m[i];
int a3, m3;
if (!merge(a1, m1, a2, m2, a3, m3))
return -1;
a1 = a3;
m1 = m3;
}
return (a1 % m1 + m1) % m1;
}
int main() {
return 0;
}