B. Phoenix and Beauty

发布时间 2023-04-09 22:06:26作者: magicat

B. Phoenix and Beauty

要求所有长度为\(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;
}