ABC 129

https://atcoder.jp/contests/abc129

A. Airplane

https://atcoder.jp/contests/abc129/tasks/abc129_a

B. Balance

https://atcoder.jp/contests/abc129/tasks/abc129_b

C. Typical Stairs

https://atcoder.jp/contests/abc129/tasks/abc129_c

D. Lamp

https://atcoder.jp/contests/abc129/tasks/abc129_d

E. Sum Equals Xor

https://atcoder.jp/contests/abc129/tasks/abc129_e

桁 DP の問題ということをわかった状態で自力 AC.

$a+b = a XOR b$ の条件から $a$ と $b$ の各桁において同時に 1 にならないことがわかる.

$i$ 桁目が 0 のとき, $a_i, b_i$ は (0,0) のみ、$i$ 桁目が 1 のとき, $a_i, b_i$ は (0,1), (1,0) の 2 通りある。

void solve() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    string L;
    cin >> L;

    // dp[is_less]
    vector<mint> dp(2);
    dp[0] = 1;

    int N = L.size();
    rep(i, N) {
        int t = L[i] - '0';
        vector<mint> dpn(2);

        rep(d, 2) rep(is_less, 2) {
            if (!is_less && d > t) continue;

            int is_less_n = is_less || d < t;
            ll mul = d == 0 ? 1 : 2;

            dpn[is_less_n] += dp[is_less] * mul;
        }

        swap(dp, dpn);
    }

    cout << (dp[0] + dp[1]).val() << endl;
}

F. Takahashi’s Basics in Education and Learning

https://atcoder.jp/contests/abc129/tasks/abc129_f