ABC 382
Table of Contents
D - Keep Distance
https://atcoder.jp/contests/abc382/tasks/abc382_d
$1 \leq x \leq y \leq z \leq 6$ を満たす $(x,y,z)$ の組み合わせを求めるのと同じ要領で解ける。
\begin{align} x^\prime &= x \nonumber \\ y^\prime &= y+1 \nonumber \\ z^\prime &= z+2 \nonumber \end{align}
とすると $1 \leq x^\prime < y^\prime < z^\prime \leq 8$ となる。 $(x^\prime, y^\prime, z^\prime)$ が決まると $(x,y,z)$ も一通りに決まるから $(x^\prime, y^\prime, z^\prime)$ の組み合わせを調べれば良い。 やることとしては $1 \sim 8$ までの数字から重複なく3つ選び小さい方から順に $(x^\prime, y^\prime, z^\prime)$ とすれば良い。
実際の問題について考える
\begin{align} &A_1 + 10 \leq A_2 \Rightarrow A_1 \leq A_2 - 10 < A_2 - 9 \nonumber \\ &A_2 + 10 \leq A_3 \Rightarrow A_2 - 9 \leq A_3 - 19 \Rightarrow A_2 - 9 < A_3 - 18 \nonumber \\ &\vdots \nonumber \end{align}
より $A^\prime_k = A_k - 9(k-1)$ とすると
$$ 1 \leq A^\prime_1 < \cdots < A^\prime_N \leq M - 9(N-1) $$である。この条件を満たす $A^\prime_i$ $(i \in [1, M-9(N-1)])$ の組を見つけ最終的に $A_i$ に戻せばよい。
ll N, M;
vvll ans;
void dfs(vll& v) {
if (v.size() == N) {
vll w = v;
ans.push_back(w);
return;
}
int s = v.back();
for (ll x = s + 1; x <= M - 9 * (N - 1); x++) {
v.push_back(x);
dfs(v);
v.pop_back();
}
}
void solve() {
cin >> N >> M;
for (ll x = 1; x <= M; x++) {
vll v = {x};
dfs(v);
}
int sz = ans.size();
rep(i, sz) rep2(j, 1, N) {
ans[i][j] += j * 9;
}
cout << ans.size() << endl;
for (auto& v : ans)
print(v);
}