本质是构造一个可行解
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;
int extgcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
int d = extgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int modInverse(int a, int m) {
int gd, x, y;
gd = extgcd(a, m, x, y);
if (gd != 1) {
return -1;
}
return (x % m + m) % m;
}
// 中国剩余定理
int chineseRemainderTheorem(const std::vector<int>& a, const std::vector<int>& m) {
int k = m.size();
int M = 1;
for (auto v : m) {
M *= v;
}
int res = 0;
for (int i = 0; i < k; i++) {
int Mi = M / m[i];
int yi = modInverse(a[i], m[i]);
res += (a[i] * Mi * yi) % M;
}
return res;
}
int main() {
std::vector<int> a = {2, 3, 2};
std::vector<int> m = {3, 5, 7};
try {
int result = chineseRemainderTheorem(a, m);
std::cout << "The solution is: " << result << std::endl;
} catch (const std::invalid_argument& e) {
std::cout << e.what() << std::endl;
}
return 0;
}