結果
問題 | No.2954 Calculation of Exponentiation |
ユーザー | InTheBloom |
提出日時 | 2024-11-08 22:48:48 |
言語 | C++23(gcc13) (gcc 13.2.0 + boost 1.83.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,158 bytes |
コンパイル時間 | 1,157 ms |
コンパイル使用メモリ | 94,508 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-11-08 22:48:57 |
合計ジャッジ時間 | 3,264 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | RE | - |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | RE | - |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | RE | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | AC | 2 ms
5,248 KB |
testcase_14 | AC | 2 ms
5,248 KB |
testcase_15 | AC | 2 ms
5,248 KB |
testcase_16 | AC | 2 ms
5,248 KB |
testcase_17 | AC | 2 ms
5,248 KB |
testcase_18 | AC | 2 ms
5,248 KB |
testcase_19 | AC | 2 ms
5,248 KB |
testcase_20 | AC | 2 ms
5,248 KB |
testcase_21 | AC | 2 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
testcase_23 | AC | 2 ms
5,248 KB |
testcase_24 | AC | 2 ms
5,248 KB |
testcase_25 | AC | 2 ms
5,248 KB |
testcase_26 | RE | - |
testcase_27 | AC | 2 ms
5,248 KB |
testcase_28 | AC | 2 ms
5,248 KB |
testcase_29 | AC | 2 ms
5,248 KB |
testcase_30 | AC | 2 ms
5,248 KB |
ソースコード
#include <iostream> #include <string> #include <utility> #include <map> #include <cassert> 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<int>(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<int, int> 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; if ((1LL * mi * b) % bd == 0) { assert(0); cout << "Yes" << "\n"; } else { cout << "No" << "\n"; } }