結果

問題 No.3030 Kruskal-Katona
ユーザー zawakasu
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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' : ' ');
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0