构造题,本题找规律,首先能发现,a的长度能决定最后数组的长度n = a + 2

且当b, c 有一个大于a时, 都判断为-1

接下来就是纯粹的构造

引入dp 思想

先把b, c中大的构造掉 直到目前的数组中b == c

如下代码清晰的注释写出了四种构造时候的情况

数据量较小,直接慢慢判即可

#include <bits/stdc++.h>
#include <vector>
using namespace std;
using i64 = long long;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    i64 a, b, c;
    cin >> a >> b >> c;
    i64 n = a + 2; //数组的长度
    if(b > a || c > a) { //若两个别的数大于a,直接判断-1
        cout << - 1;
        return 0;
    }

    vector<i64> ans(n);
    ans[0] = 1;
    ans[1] = 1; //构造数组 数组的前两项设为1

    for(int i = 2; i < n; i++) { //从第三个项开始判断,先判断多的那一份,构造只符合这一项的,若相等后再构造二者都能适用的
        i64 temp = 1; // 用来判断此时构造的数据符不符合
        i64 sum = temp + ans[i - 1] + ans[i - 2];
        if(b > c) {
            while (!(sum % 2 == 0 && sum % 3 != 0)) {
                temp++;
                sum++;
            }
            ans[i] = temp;
            b--;
            continue;
            
        } // 先处理b > c 的情况
        
        else if(c > b) {
            while (!(sum % 3 == 0 && sum % 2 != 0)) {
                temp++;
                sum++;
            }
            ans[i] = temp;
            c--;
            continue;
            
        } // 处理b < c 的情况

        else if(c == b && c != 0 && b != 0) {
            while (!(sum % 3 == 0 && sum % 2 == 0)) {
                temp++;
                sum++;
            }
            ans[i] = temp;
            b--;
            c--;
            continue;
            
        } // b == c && b, c != 0;

        else if(c == b && c == 0 && b == 0) {
            while (!(sum % 3 != 0 && sum % 2 != 0)) {
                temp++;
                sum++;
            }
            ans[i] = temp;
            continue;  
        } // b == c && b, c != 0;
    }

    cout << n << endl;
    for(auto &i:ans) {
        cout << i << ' ';
    }


}