#include #include #include bool checkhalf(const std::unordered_map& full, const std::unordered_map& first, const std::unordered_map& second) { for (auto [key, count] : full) { auto it1 = first.find(key); auto it2 = second.find(key); if ((it1 == first.end()) || (it2 == second.end()) || (count != (it1->second + it2->second))) { return false; } } return true; } int main() { long long n; std::cin >> n; for (int i = 0; i < n; i++) { int a, b, c; std::cin >> a >> b >> c; int highest; int lower1, lower2; if (a > b && a > c) { highest = a; lower1 = b; lower2 = c; } else if (b > a && b > c) { highest = b; lower1 = a; lower2 = c; } else if (c > a && c > b) { highest = c; lower1 = a; lower2 = b; } else { std::cout << "NO" << std::endl; continue; } if ((highest != lower1 * lower2) || ((lower1 % 10 == 0) && (lower2 % 10 == 0))) { std::cout << "NO" << std::endl; continue; } std::string hstring = std::to_string(highest); std::string l1string = std::to_string(lower1); std::string l2string = std::to_string(lower2); std::unordered_map first; std::unordered_map second; if ((hstring.length() != l2string.length() + l1string.length()) || (l2string.length() != l1string.length())) { std::cout << "NO" << std::endl; continue; } std::unordered_map highercount; for (int i = 0; i < hstring.length() / 2; i++) { first[l1string[i]]++; second[l2string[i]]++; highercount[hstring[i]]++; } for (int i = hstring.length() / 2; i < hstring.length(); i++) { highercount[hstring[i]]++; } if (checkhalf(highercount, first, second)) { std::cout << "YES" << std::endl; } else { std::cout << "NO" << std::endl; } } return 0; }