要求所有长度为\(k\)的子数组之和相同,观察样例可以发现,当原数组中不同的元素个数小于等于\(k\)时可以满足条件,同时输出的数组长度\(m\)很大,可以从这里入手
构造一个有所有元素的数组,当这个数组长度不足时,补其他元素进去,答案即为 \(\frac{10000} {k}\) 个这样的数组
为什么这样的数组可以满足原始数组的顺序,因为\(n \leq 100\),\(m \leq 10000\),\(100\)个数组的子序列可以满足原始数组的顺序,证明略
// AC one more times
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(), (x).end()
#define inf64 0x3f3f3f3f3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<long long,long long> pll;
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
void solve()
{
int n, m; cin>>n>>m;
int cnt[n + 10];
memset(cnt, 0, sizeof cnt);
int mav = 0;
for(int i = 1; i <= n; i++)
{
int x; cin>>x;
cnt[x]++;
mav = max(mav, cnt[x]);
}
vector<int> ans;
int sum = 0;
int miv = 101, p1 = 0;
for(int i = 1; i <= n; i++)
{
if(cnt[i] >= 1)
{
ans.pb(i);
sum++;
miv = min(miv, i);
if(cnt[i] > p1)
p1 = cnt[i], miv = i;
}
}
if(sum > m)
{
cout<<-1<<endl;
return;
}
mav = 10000 / m;
cout<<mav * m<<endl;
while(mav--)
{
int cnt = 0;
for(auto v : ans)
{
cout<<v<<" ";
cnt++;
}
cnt = m - cnt;
while(cnt--)
cout<<miv<<" ";
}
cout<<endl;
return;
}
int main()
{
//std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
// 特殊输入 请注释上方,如__int128等
int TC = 1;
cin >> TC;
for(int tc = 1; tc <= TC; tc++)
{
//cout << "Case #" << tc << ": ";
solve();
}
return 0;
}