ABC 262
Table of Contents
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
考えたこと
- 平均が整数になるということは $k$ 個を選んだとしたら選んだ数の和が $k$ で割り切れるということ
- $a_i$ を $k$ で割った余りを求めてそれらから $k$ 個を選んだときの和の余りが $0$ になる組み合わせの数を求めれば良い
- dp が使えそう
- $i$ 番目までの要素を見たときに $j$ 個を選んだときの和の余りが $m$ になる組み合わせは dp で求められる
- 全ての $k$ について求めて足し合わせる
- $N \leq 100$ だから $O(N^4)$ でも間に合う
解法
$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