首先有:
- 任意的数都是
的倍数;
- 长度为
的数组中,长为
的子数组数量为
。
这样就可以得到数组的长度为 。
然后就能分析边界条件。直觉上来看,应该是当 的时候无解。
事实上,是 时无解。
因为当构造出 这种序列时,是可以直接包含
和
两种情况的。
因此我们只需要先构造值为 的区间即可。
然后分类讨论 和
。
当 时,下一步需要构造的是
的倍数且不是
的倍数,即
,最后构造既不是
的倍数也不是
的倍数的数,即
。
同理,当 时,下一步需要构造的是
的倍数且不是
的倍数,即
,最后构造既不是
的倍数也不是
的倍数的数,即
。
而上述说的构造,其实就是通过之前的两个数和三个数的和来推出当前数。
代码如下:
#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;
}

京公网安备 11010502036488号