結果
問題 |
No.3112 Decrement or Mod Game
|
ユーザー |
|
提出日時 | 2025-04-19 19:47:38 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 1,783 bytes |
コンパイル時間 | 616 ms |
コンパイル使用メモリ | 83,788 KB |
実行使用メモリ | 814,592 KB |
最終ジャッジ日時 | 2025-04-19 19:47:44 |
合計ジャッジ時間 | 4,389 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | MLE * 1 -- * 64 |
ソースコード
#include <iostream> #include <unordered_map> #include <tuple> using namespace std; // std::tuple<long long, long long> 用のカスタムハッシュ関数 struct tuple_hash { template <class T1, class T2> std::size_t operator ( )(const std::tuple<T1, T2>& t) const { auto h1 = std::hash<T1>{}(std::get<0>(t)); auto h2 = std::hash<T2>{}(std::get<1>(t)); return h1 ^ (h2 << 1); // 2つのハッシュ値を組み合わせる } }; // メモ化用のハッシュマップ unordered_map<tuple<long long, long long>, bool, tuple_hash> memo; // 再帰的に勝敗を判定する関数 bool canAliceWin(long long A, long long B) { // すでに計算した状態はメモ化された結果を返す if (memo.find(make_tuple(A, B)) != memo.end()) { return memo[make_tuple(A, B)]; } // ゲーム終了条件: どちらかの数が0なら、その時点で勝者が決定 if (A == 0) { return true; // Aliceの数が0になったのでBobの勝ち } if (B == 0) { return false; // Bobの数が0になったのでAliceの勝ち } // Aliceのターン // 1. Aliceが自分の数を1減らす if (!canAliceWin(A - 1, B)) { memo[make_tuple(A, B)] = true; return true; } // 2. Aliceが自分の数をBで割った余りにする(B <= Aの場合のみ) if (B <= A && !canAliceWin(A % B, B)) { memo[make_tuple(A, B)] = true; return true; } // Bobのターンになってしまう場合 memo[make_tuple(A, B)] = false; return false; } int main() { long long A, B; cin >> A >> B; if (canAliceWin(A, B)) { cout << "Alice" << endl; } else { cout << "Bob" << endl; } return 0; }