結果

問題 No.3246 80% Accuracy Calculator
ユーザー AngrySadEight
提出日時 2025-07-27 01:35:07
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
(最新)
AC  
(最初)
実行時間 -
コード長 2,602 bytes
コンパイル時間 914 ms
コンパイル使用メモリ 86,028 KB
実行使用メモリ 26,468 KB
平均クエリ数 3555.84
最終ジャッジ日時 2025-07-27 02:50:47
合計ジャッジ時間 9,435 ms
ジャッジサーバーID
(参考情報)
judge6 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 3 WA * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cassert>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
using ll = long long;

ll get_most(char reg, ll times) {
    map<ll, ll> mp;

    for (ll i = 0; i < times; i++) {
        cout << "? " << reg << endl;
        ll val;
        cin >> val;
        if (val == -1) {
            return -1;
        }
        mp[val]++;
    }
    ll max_times = 0;
    ll max_val = -1;
    for (auto it = mp.begin(); it != mp.end(); it++) {
        if (max_times < it->second) {
            max_times = it->second;
            max_val = it->first;
        }
    }
    return max_val;
}

int main() {
    const ll iter_times = 100;
    ll x = get_most('A', iter_times);
    ll y = get_most('B', iter_times);

    // 繰り返し二倍法を実装する
    vector<ll> bins(10);
    for (ll i = 0; i < 10; i++) {
        if ((y >> i) & 1) {
            bins[i] = 1;
        }
    }
    vector<ll> ans = {x, y, 0};

    ll now_x = 0;
    ll now_ans = 2;
    for (ll i = 0; i < 10; i++) {
        // そのビットがあるなら足す
        if (bins[i]) {
            while (true) {
                char reg1 = (char)(now_x + 'A');
                char reg2 = (char)(now_ans + 'A');
                ll r3 = 3 - now_x - now_ans;
                char reg3 = (char)(r3 + 'A');

                ans[r3] = ans[now_x] + ans[now_ans];
                cout << "+ " << reg1 << " " << reg2 << " " << reg3 << endl;
                ll z;
                cin >> z;
                if (z != 0) {
                    return 0;
                }
                now_ans = r3;

                ll val = get_most(reg3, iter_times);
                if (val == -1) {
                    return 0;
                }
                if (val == ans[r3]) {
                    break;
                }
            }
        }
        // x + x = 2x をする
        while (true) {
            char reg1 = (char)(now_x + 'A');
            ll r2 = 3 - now_x - now_ans;
            char reg2 = (char)(r2 + 'A');
            cout << "+ " << reg1 << " " << reg1 << " " << reg2 << endl;

            ans[r2] = ans[now_x] + ans[now_x];
            now_x = r2;

            ll z;
            cin >> z;
            if (z != 0) {
                return 0;
            }

            ll val = get_most(reg2, iter_times);
            if (val == -1) {
                return 0;
            }
            if (val == ans[r2]) {
                break;
            }
        }
        if (ans[now_ans] == x * y) {
            break;
        }
    }

    char reg = (char)(now_ans + 'A');
    cout << "! " << reg << endl;
}
0