結果
問題 |
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' : ' '); }