実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 234
問題概要
以下の条件を満たす長さ の整数列を辞書順で小さい方から全て出力せよ。
- 条件 :
- 番目の要素は 以上 以下。
- 総和が の倍数である。
制約
- 入力はすべて整数。
考察
考えられる整数列は最大でも なので、候補を全列挙する方針で考えてみる。
辞書順で小さい順に出力するので、初期状態が という配列を作り、右端の要素から順に1ずつ加算していく。具体的なアルゴリズムは以下の通り。
- 配列 を で初期化し、和 を とする。
- 配列のインデックス になるまで以下の操作を繰り返す。
- が の倍数ならば の中身を出力する。
- とする。
- (上限に到達している) ならば、 に戻し、 を 減らす (1個左を見る) 。 も調整。
- を判定。
- を 増やし、 も 増やす。
コード
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) // ======================================== // int main() { int N, K; cin >> N >> K; vector<int> R(N); rep(i, 0, N) cin >> R[i]; vector<int> ans(N, 1); int sum = N; while (true) { if (sum % K == 0) { for (int x : ans) cout << x << " "; cout << endl; } int idx = N - 1; while (idx >= 0 && ans[idx] == R[idx]) { sum -= ans[idx]; ans[idx] = 1; sum++; idx--; } if (idx < 0) break; ans[idx]++; sum++; } }
実装時間: 10分