Problem - 1348B - Codeforces
解析:
满足题意,会构成循环序列,其中循环节长度为 k,统计数列中不同元素的个数 cnt ,如果cnt > k,显然无解。
否则,由于题意中已经证明,答案序列个数小于等于 10000,并且 n和k的范围都为100,则n*k小于等于10000,所以我们直接把去重后的序列 a 重复 n 次即可。并且如果a不足k个,直接补 1即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int t,n,k,a[N];
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&k);
set<int>s;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
s.insert(a[i]);
}
if(s.size()>k) puts("-1");
else{
vector<int>v;
for(auto it:s) v.push_back(it);
printf("%lld\n",n*k);
for(int i=1;i<=n;i++){
for(int j=0;j<v.size();j++) printf("%lld ",v[j]);
for(int j=1;j<=k-v.size();j++) printf("1 ");
}
printf("\n");
}
}
return 0;
}