int n, m, x, y, B, G; std::vector<int> b[kMaxN], g[kMaxN];
intexgcd(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 -= a / b * x; return d; }
intsolve(int n, int m, int x, std::vector<int> &b, std::vector<int> &g){ if (g.size() == m) return-1; std::vector<std::tuple<int, int, int>> vec; for (auto i : b) vec.emplace_back(i * x % m, 0, i); for (auto i : g) vec.emplace_back(i * x % m, 1, i); std::sort(vec.begin(), vec.end()); vec.emplace_back(std::get<0>(vec.front()) + m, std::get<1>(vec.front()), std::get<2>(vec.front())); int ret = 0, dis = kInf; for (int i = 1; i < (int)vec.size(); ++i) dis = std::min(dis + n * (std::get<0>(vec[i]) - std::get<0>(vec[i - 1])), std::get<2>(vec[i])); for (int i = 0; i + 1 < (int)vec.size(); ++i) { if (i) dis = std::min(dis + n * (std::get<0>(vec[i]) - std::get<0>(vec[i - 1])), std::get<2>(vec[i])); if (std::get<0>(vec[i]) == std::get<0>(vec[i + 1])) continue; if (std::get<0>(vec[i + 1]) - std::get<0>(vec[i]) > 1) ret = std::max(ret, dis + n * (std::get<0>(vec[i + 1]) - std::get<0>(vec[i]) - 1)); elseif (!std::get<1>(vec[i])) ret = std::max(ret, dis); } return ret; }
voiddickdreamer(){ std::cin >> n >> m >> B; int d = exgcd(n, m, x, y); if (d > 2e5) returnvoid(std::cout << "-1\n"); for (int i = 1; i <= B; ++i) { int x; std::cin >> x; b[x % d].emplace_back(x / d); } std::cin >> G; for (int i = 1; i <= G; ++i) { int x; std::cin >> x; g[x % d].emplace_back(x / d); } x = (x % m + m) % m, y = (y % n + n) % n; int ans = 0; for (int i = 0; i < d; ++i) { if (b[i].empty() && g[i].empty()) returnvoid(std::cout << "-1\n"); ans = std::max(ans, solve(n / d, m / d, x, b[i], g[i]) * d + i); ans = std::max(ans, solve(m / d, n / d, y, g[i], b[i]) * d + i); } std::cout << ans << '\n'; }