B. Phoenix and Beauty(1348B)(思维)
来源:B. Phoenix and Beauty
题意:
给一个长度为n的数组,以及一个整数m,可以向数组中添加元素,使得这个数组任意两个连续的k个数的和都相等。有解时保证构造的长度小于1e4,无解输出-1
思路:
a[1] 到 a[k] 的和等于a[2] 到 a[k + 1] 的和,说明a[1] == a[k + 1],所以任意两个长度为k的字段排序后全都相等。那么当数组中数的种类大于k时,一定不能构造,小于等于k时,进行n此操作,每次操作将这k种数按出先的顺序先输出一遍,之后任意补充元素补够k个即可。
代码:
#include <bits/stdc++.h>
#define endl "\n"
#define debug(a) cout << #a << " = " << a << endl;
#define rep(i, m, n) for (int i = (m); i <= (n); ++i)
#define rrep(i, m, n) for (int i = (m); i >= (n); --i)
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 1e5 + 10, mod = 1e9 + 7;
int n, m;
void solve() {
set<int> st;
scanf("%d %d", &n, &m);
rep(i, 1, n) {
int a; scanf("%d", &a);
st.insert(a);
}
if (st.size() > m) { puts("-1"); return; }
printf("%d\n", n* m);
rep(i, 1, n) {
for (auto& op : st) printf("%d ", op);
rep(j, 1, m - st.size()) printf("1 ");
if (i == n) puts("");
}
}
int main() {
int t; cin >> t;
while (t--) solve();
return 0;
}