T2 怎么证明啊
  • 板块灌水区
  • 楼主Micnation_AFO
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/8/13 18:06
  • 上次更新2023/10/27 15:35:00
查看原帖
T2 怎么证明啊
574944
Micnation_AFO楼主2022/8/13 18:06

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=1ans_1 = 0, ans_2 = ans_sum = 1,然后从 3 开始向后构造

2022/8/13 18:06
加载中...