#include #include #include bool checkhalf(const std::unordered_map& half, const std::unordered_map& tocheck) { for (auto [key, count] : half) { auto it = tocheck.find(key); if (it == tocheck.end() || (*it).second != count) { 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 { lower1 = a; lower2 = b; highest = c; } if (highest != lower1 * lower2) { std::cout << "NO" << std::endl; continue; } std::string hstring = std::to_string(highest); std::unordered_map first; std::unordered_map second; std::string l1string = std::to_string(lower1); std::string l2string = std::to_string(lower2); if ((hstring.length() != l2string.length() + l1string.length()) && (l2string.length() != l1string.length())) { std::cout << "NO" << std::endl; continue; } if ((lower1 % 10 == 0) && (lower2 % 10 == 0)) { std::cout << "NO" << std::endl; continue; } std::unordered_map firsthalf; std::unordered_map secondhalf; for (int i = 0; i < hstring.length() / 2; i++) { first[l1string[i]]++; second[l2string[i]]++; firsthalf[hstring[i]]++; } for (int i = hstring.length() / 2; i < hstring.length(); i++) { secondhalf[hstring[i]]++; } if ((checkhalf(firsthalf, first) && checkhalf(secondhalf, second)) || (checkhalf(firsthalf, second) && checkhalf(secondhalf, firsthalf)) ) { std::cout << "YES" << std::endl; } else { std::cout << "NO" << std::endl; } } return 0; }