ABC 425

https://atcoder.jp/contests/abc425

A. Sigma Cubes

https://atcoder.jp/contests/abc425/tasks/abc425_a

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

    ll N;
    cin >> N;

    ll ans = 0;
    rep2(i, 1, N + 1) {
        ans += intpow(-1, i) * intpow(i, 3);
    }
    cout << ans << endl;
}

B. Find Permutation 2

https://atcoder.jp/contests/abc425/tasks/abc425_b

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

    ll N;
    cin >> N;
    vll A(N);
    rep(i, N) cin >> A[i];

    vint P(N);
    iota(all(P), 1);

    do {
        int ok = 1;
        rep(i, N) {
            if (A[i] == -1) continue;
            if (A[i] != P[i]) ok = 0;
        }
        if (ok) {
            Yes();
            print(P);
            return;
        }
    } while (next_permutation(all(P)));

    No();
}

C. Rotate and Sum Query

https://atcoder.jp/contests/abc425/tasks/abc425_c

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

    ll N, Q;
    cin >> N >> Q;
    fenwick_tree<ll> fw(N);

    rep(i, N) {
        ll a;
        cin >> a;
        fw.add(i, a);
    }

    int start = 0;

    rep(i, Q) {
        int t;
        cin >> t;
        if (t == 1) {
            ll c;
            cin >> c;
            start += c;
            start %= N;
        } else {
            ll l, r;
            cin >> l >> r;
            l--, r--;

            l += start;
            r += start;
            l %= N;
            r %= N;

            if (r < l) {
                cout << fw.sum(l, N) + fw.sum(0, r + 1) << endl;
            } else {
                cout << fw.sum(l, r + 1) << endl;
            }
        }
    }
}

D. Ulam-Warburton Automaton

https://atcoder.jp/contests/abc425/tasks/abc425_d

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

    ll H, W;
    cin >> H >> W;
    vector<string> grid(H);
    rep(i, H) cin >> grid[i];

    vint di = {0, 1, 0, -1};
    vint dj = {1, 0, -1, 0};

    vvint used(H, vint(W));

    using P = pair<int, int>;
    deque<P> deq;
    rep(i, H) rep(j, W) {
        if (grid[i][j] == '#') {
            used[i][j] = 1;
            continue;
        }
        int cnt = 0;
        rep(d, 4) {
            ll ni = i + di[d], nj = j + dj[d];
            if (clamp(ni, 0ll, H - 1) != ni || clamp(nj, 0ll, W - 1) != nj) continue;
            if (grid[ni][nj] == '#') cnt++;
        }
        if (cnt == 1) deq.push_back({i, j});
    }

    while (deq.size()) {
        for (auto [i, j] : deq) {
            grid[i][j] = '#';
            used[i][j] = 1;
        }

        deque<P> deqn;

        for (auto [oi, oj] : deq) {
            rep(d, 4) {
                ll i = oi + di[d], j = oj + dj[d];
                if (clamp(i, 0ll, H - 1) != i || clamp(j, 0ll, W - 1) != j) continue;
                if (grid[i][j] == '#') continue;

                int cnt = 0;
                rep(dd, 4) {
                    ll ni = i + di[dd], nj = j + dj[dd];
                    if (clamp(ni, 0ll, H - 1) != ni || clamp(nj, 0ll, W - 1) != nj) continue;
                    if (grid[ni][nj] == '#') cnt++;
                }
                if (cnt == 1 && used[i][j] == 0) {
                    used[i][j] = 1;
                    deqn.push_back({i, j});
                }
            }
        }

        swap(deq, deqn);
    }

    ll ans = 0;
    rep(i, H) rep(j, W) if (grid[i][j] == '#') ans++;
    cout << ans << endl;
}

E. Count Sequences 2

https://atcoder.jp/contests/abc425/tasks/abc425_e

解説 AC

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

    ll T, M;
    cin >> T >> M;

    modint::set_mod(M);
    using mint = modint;

    int upper = 5001;
    vector binom(upper, vector<mint>(upper));
    vector checked(upper, vint(upper));
    binom[0][0] = checked[0][0] = 1;

    auto dfs = [&](auto dfs, ll n, ll k) -> mint {
        if (n < 0 || k < 0) return 0;
        if (checked[n][k]) return binom[n][k];
        if (n < k) return 0;
        if (k == 0) return 1;
        mint ret = dfs(dfs, n - 1, k - 1) + dfs(dfs, n - 1, k);
        checked[n][k] = 1;
        return binom[n][k] = ret;
    };

    auto cal = [&]() -> void {
        ll N;
        cin >> N;
        vll C(N);
        rep(i, N) cin >> C[i];

        mint ans = 1;
        ll ctot = accumulate(all(C), 0ll);
        ll sub = 0;
        for (auto c : C) {
            ans *= dfs(dfs, ctot - sub, c);
            sub += c;
        }
        cout << ans.val() << endl;
    };

    while (T--) {
        cal();
    }
}

F. Inserting Process

https://atcoder.jp/contests/abc425/tasks/abc425_f

G. Sum of Min of XOR

https://atcoder.jp/contests/abc425/tasks/abc425_g