#include #include #include #include #include using namespace std; using ll = long long; int main () { // 未証明だけど、とりあえず次のアルゴで動かす。 // まず、Aが整数でないと即死。 -> これは嘘です。 // Aが整数なら、できるだけ冪で表現する。(A = 1は0乗として扱う) // それを使ってBを崩しに行って、整数になればOK string A, B; cin >> A >> B; auto f = [&] (string S) { bool minus = false; if (S.find('-') != string::npos) { minus = true; S = S.substr(1); } int d = S.find('.'); bool has = false; for (int i = 0; i < d; i++) { if (S[i] != '0') has = true; } if (!has) S = S.substr(d); for (int i = 0; i < S.size() - 1; i++) { if (S[i] == '.') swap(S[i], S[i + 1]); } S = S.substr(0, S.size() - 1); int b = static_cast(S.size() - 1); for (int i = 0; i < S.size() - 1; i++) { if (S[i] != '0') { b = i; break; } } if (!minus) { return make_pair(stoll(S.substr(b)), 10000LL); } return make_pair(10000LL, stoll(S.substr(b))); }; auto&& [a, ad] = f(A); auto&& [b, bd] = f(B); // この先b側を反転させる可能性があるので、これを先に除く。 if (b == 0) { cout << "Yes" << "\n"; return 0; } if (0 < a % ad && 0 < ad % a) { cout << "No" << "\n"; return 0; } if (ad % a == 0) { swap(a, ad); swap(b, bd); } a /= ad; ad = 1; map mp; for (int i = 2; i <= a; i++) { while (a % i == 0) { a /= i; mp[i]++; } } int mi = 1000000000; for (auto& v : mp) { mi = min(mi, v.second); } if (mi == 1000000000) mi = 0; assert(0 <= 1LL * mi * b); assert(0 < bd); if ((1LL * mi * b) % bd == 0) { cout << "Yes" << "\n"; } else { cout << "No" << "\n"; } }