提交时间:2026-06-17 06:44:04

运行 ID: 91816

#include <iostream> #include <string> #include <algorithm> using namespace std; // 比较:a < b ? bool cmp(const string &a, const string &b) { if (a.size() != b.size()) return a.size() < b.size(); return a < b; } // 大数加法 a + b string add(const string &a, const string &b) { string res; int i = a.size()-1, j = b.size()-1, c = 0; while (i >= 0 || j >= 0 || c) { int x = (i >= 0 ? a[i--] - '0' : 0); int y = (j >= 0 ? b[j--] - '0' : 0); int s = x + y + c; res.push_back(s % 10 + '0'); c = s / 10; } reverse(res.begin(), res.end()); return res; } // 大数减法 a - b,保证 a >= b string sub(const string &a, const string &b) { string res; int i = a.size()-1, j = b.size()-1, borrow = 0; while (i >= 0) { int x = a[i--] - '0' - borrow; int y = j >= 0 ? b[j--] - '0' : 0; borrow = 0; if (x < y) { x += 10; borrow = 1; } res.push_back(x - y + '0'); } reverse(res.begin(), res.end()); size_t p = res.find_first_not_of('0'); return p == string::npos ? "0" : res.substr(p); } // 大数除以 2 string div2(const string &a) { string res; int rem = 0; for (char ch : a) { int cur = rem * 10 + ch - '0'; res.push_back(cur / 2 + '0'); rem = cur % 2; } size_t p = res.find_first_not_of('0'); return p == string::npos ? "0" : res.substr(p); } // 大数乘法 a * b string mul(const string &a, const string &b) { int n = a.size(), m = b.size(); string res(n + m, '0'); for (int i = n-1; i >= 0; --i) { int carry = 0; int da = a[i] - '0'; for (int j = m-1; j >= 0; --j) { int db = b[j] - '0'; int sum = (res[i+j+1]-'0') + da * db + carry; res[i+j+1] = sum % 10 + '0'; carry = sum / 10; } res[i] += carry; } size_t p = res.find_first_not_of('0'); return p == string::npos ? "0" : res.substr(p); } // 二分求 floor(sqrt(x)) string sqrt_big(string x) { string l = "1", r = x, ans = "0"; while (!cmp(r, l)) { string mid = div2(add(l, r)); string sq = mul(mid, mid); if (!cmp(x, sq)) { ans = mid; l = add(mid, "1"); } else { r = sub(mid, "1"); } } return ans; } int main() { string n, m; cin >> n >> m; string a = sqrt_big(n); string b = sqrt_big(m); cout << mul(a, b) << endl; return 0; }