結果
問題 | No.3030 Kruskal-Katona |
ユーザー |
![]() |
提出日時 | 2025-02-21 22:08:18 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 871 ms / 2,000 ms |
コード長 | 1,964 bytes |
コンパイル時間 | 1,067 ms |
コンパイル使用メモリ | 105,804 KB |
実行使用メモリ | 11,492 KB |
最終ジャッジ日時 | 2025-02-21 22:08:35 |
合計ジャッジ時間 | 10,661 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#include <iostream>#include <iomanip>#include <cassert>#include <vector>#include <algorithm>#include <utility>const int MAX = 1000;long long C[MAX][MAX];int N, p;int main() {std::cin.tie(nullptr)->sync_with_stdio(false);for (int i = 0 ; i < MAX ; i++) for (int j = 0 ; j < MAX ; j++) C[i][j] = -1;std::cin >> N >> p;if (p == 1) {std::cout << N << '\n';std::exit(0);}if (p == 2) {for (int i = 2 ; i < 21000 ; i++) for (int j = 1 ; j < i ; j++) {long long v = (long long)i * (i - 1) / 2 + j;if (v == N) {std::cout << i << ' ' << j << '\n';std::exit(0);}}for (int i = 2 ; i < 21000 ; i++) {long long v = i * (i - 1) / 2;// std::cout << v << std::endl;if (v == N) {std::cout << i << '\n';std::exit(0);}}assert(false);}for (int i = 0 ; i < MAX ; i++) C[i][0] = C[i][i] = 1;for (int i = 0 ; i < MAX ; i++) for (int j = 1 ; j < i ; j++) {if (C[i - 1][j - 1] == -1 or C[i - 1][j] == -1) C[i][j] = -1;else C[i][j] = C[i - 1][j - 1] + C[i - 1][j];if (C[i][j] > N) C[i][j] = -1;}std::vector<int> ans;auto rec = [&](auto rec, long long n, int last, int i) -> bool {assert(n >= 0);assert(i >= 0);if (n == 0) return true;if (i == 0) return false;for (int j = i ; j < last ; j++) if (C[j][i] != -1 and C[j][i] <= n) {n -= C[j][i];ans.push_back(j);if (rec(rec, n, j, i - 1)) return true;ans.pop_back();n += C[j][i];}return false;};assert(rec(rec, N, MAX - 1, p));// std::reverse(ans.begin(), ans.end());for (int i = 0 ; i < (int)ans.size() ; i++) std::cout << ans[i] << (i + 1 == (int)ans.size() ? '\n' : ' ');}