https://codeforces.com/contest/1348/problem/B
题意:
给一个长为 n 的数组,向其中随意插入元素,使任何长为 k 的连续子列的和相等
\(k,n\le 100\) ,新数组的长度不能超过 1e4
思路:
要使 \(a_1+a_2+a_3+a_4=a_2+a_3+a_4+a_5\) ,只需 \(a_1=a_5\)
所以新数组需满足 \(a_i=a_{i+k},\forall i\) ,也就是构造一个周期为 k 的周期序列。若原数组中的数字种类大于 k 则无法构造
因为范围很小,所以对原数组中的每个数,都插入 k-1 个数即可
#include <bits/stdc++.h>
using namespace std;
int n, k, a[110];
signed main()
{
int T; scanf("%d", &T); while(T--)
{
vector<int> ve; memset(a, 0, sizeof a);
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++)
{
int x; scanf("%d", &x);
if(!a[x]) a[x] = 1, ve.push_back(x);
}
int len = ve.size();
if(len > k)
{
puts("-1");
continue;
}
while(len < k)
{ //直接让数组超级加倍到比k长
for(int i = 0; i < len; i++)
ve.push_back(ve[i]);
len = ve.size();
}
printf("%d\n", n*k);
while(n--) for(int i = 0; i < k; i++)
printf("%d ", ve[i]);
puts("");
}
return 0;
}