rt,瞎写了一个,结果就 A 了:
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int M = 2e7;
const int N = 35;
int n;
int ans[M];
void print(int len) {
for (int i = 1; i <= len; i++) printf("%d ", ans[i]);
puts("");
}
void dfs(int n, int sum, int x, int num[]) {
if (x == sum + 1) {
if (abs(ans[1] - ans[x - 1]) != 1) return;
print(sum);
exit(0);
}
for (int i = 0; i <= n; i++) {
if (!num[i]) continue;
if (x != 1 && abs(i - ans[x - 1]) != 1) continue;
ans[x] = i, num[i]--, dfs(n, sum, x + 1, num), num[i]++;
}
}
void work(int n) {
int num[N];
__int128 C[N][N], mul[N];
mul[0] = mul[1] = 1;
for (int i = 1; i <= n; i++) mul[i] = i * mul[i - 1];
for (int i = 0; i <= n; i++)
for (int j = 0; j <= i; j++) C[i][j] = mul[i] / (mul[j] * mul[i - j]);
int sum = 0;
for (int i = 0; i <= n; i++) num[i] = C[n][i], sum += C[n][i];
//for (int i = 0; i <= n; i++) cout << i << " " << num[i] << endl;
ans[1] = 0, ans[2] = 1, ans[sum] = 1; num[0]--, num[1] -= 2;
for (int i = 3; i < sum; i++) {
if (num[ans[i - 1] + 1] > 0) {
ans[i] = ans[i - 1] + 1;
num[ans[i - 1] + 1]--;
}
else {
ans[i] = ans[i - 1] - 1;
num[ans[i - 1] - 1]--;
}
}
for (int i = 1; i <= sum; i++) cout << ans[i] << " ";
//memset(ans, 0, sizeof(ans));
//dfs(n, sum, 1, num);
}
int main() {
cin >> n;
work(n);
return 0;
}
就是 ans1=0,ans2=anssum=1,然后从 3 开始向后构造