首先有:

  • 任意的数都是 的倍数;
  • 长度为 的数组中,长为 的子数组数量为

这样就可以得到数组的长度为

然后就能分析边界条件。直觉上来看,应该是当 的时候无解。

事实上,是 时无解。

因为当构造出 这种序列时,是可以直接包含 两种情况的。

因此我们只需要先构造值为 的区间即可。

然后分类讨论

时,下一步需要构造的是 的倍数且不是 的倍数,即 ,最后构造既不是 的倍数也不是 的倍数的数,即

同理,当 时,下一步需要构造的是 的倍数且不是 的倍数,即 ,最后构造既不是 的倍数也不是 的倍数的数,即

而上述说的构造,其实就是通过之前的两个数和三个数的和来推出当前数。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int last1, last2;
void gz(int x)
{
    int new_ = x - last1 - last2;
    cout << new_ << ' ';
    last2 = last1;
    last1 = new_;
}
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    if (c > b)
    {
        if (c > a)
        {
            puts("-1");
            return 0;
        }
        cout << a + 2 << '\n';
        last1 = last2 = 2;
        for (int i = 1; i <= b + 2; i++)
            gz(6);
        for (int i = b + 3; i <= c + 2; i++)
            gz(9);
        for (int i = c + 3; i <= a + 2; i++)
            gz(11);
    }
    else
    {
        if (b > a)
        {
            puts("-1");
            return 0;
        }
        cout << a + 2 << '\n';
        last1 = last2 = 2;
        for (int i = 1; i <= c + 2; i++)
            gz(6);
        for (int i = c + 3; i <= b + 2; i++)
            gz(8);
        for (int i = b + 3; i <= a + 2; i++)
            gz(11);
    }
    return 0;
}