ABC 262

https://atcoder.jp/contests/abc262

A. World Cup

https://atcoder.jp/contests/abc262/tasks/abc262_a

B. Triangle (Easier)

https://atcoder.jp/contests/abc262/tasks/abc262_b

C. Min Max Pair

https://atcoder.jp/contests/abc262/tasks/abc262_c

D. I Hate Non-integer Number

https://atcoder.jp/contests/abc262/tasks/abc262_d

自力 AC

考えたこと

解法

$a_i$ を $d \in [1, N]$ で割った余りを予め求めておいて、その中から $d$ 個を選んだ和を $d$ で割った余りが $0$ となる組み合わせの数を求める。 これを全ての $d$ について求めて足し合わせる。

$dp_m(i,j,k)$ を $i$ 番目までの要素を $j$ 個選んだときの和を $m$ で割った余りが $k$ となる組み合わせの数として DP を行う。

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

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

    vvll mod(N + 1, vll(N));
    rep2(m, 1, N + 1) rep(i, N) {
        mod[m][i] = A[i] % m;
    }

    mint ans = 0;
    rep2(m, 1, N + 1) {
        vector dp(vector(N + 1, vector(N + 1, vector<mint>(N))));
        rep(i, N) {
            dp[i][0][0] = 1;
        }

        rep2(i, 1, N + 1) {
            rep2(j, 1, N + 1) {
                rep(k, m) {
                    // i 番目の数字を選ばない
                    dp[i][j][k] += dp[i - 1][j][k];

                    // i 番目の数字を選ぶ
                    dp[i][j][k] += dp[i - 1][j - 1][(m - mod[m][i - 1] + k) % m];
                }
            }
        }
        ans += dp[N][m][0];
    }

    cout << ans.val() << endl;
}

E. Red and Blue Graph

https://atcoder.jp/contests/abc262/tasks/abc262_e

F. Erase and Rotate

https://atcoder.jp/contests/abc262/tasks/abc262_f

G. LIS with Stack

https://atcoder.jp/contests/abc262/tasks/abc262_g

Ex. Max Limited Sequence

https://atcoder.jp/contests/abc262/tasks/abc262_h