推出有循环节了,思路是找循环节取余,但是不到怎么快速求mex,#6#7T了
#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<vector>
#define int long long
using namespace std;
int T;
const int N = 1000010;
int a[N] , b[N] , New[N];
unordered_map<int , int> h;
int n , k;
vector<int> g[11];
vector<int> Ans[11];
bool check(int x , int y){
for(int i = 0;i < n;i++){
if(g[x][i] != g[y][i]) return false;
}
return true;
}
signed main(){
cin >> T;
while(T--){
h.clear();
memset(Ans , 0 , sizeof Ans);
memset(g , 0 , sizeof g);
scanf("%lld%lld" , &n , &k); --k;
for(int i = 1;i <= n;i++) scanf("%lld" , &a[i]);
for(int d = 0;d < 4;d++){
for(int i = 1;i <= n;i++){
h.clear();
for(int j = 1;j <= n;j++){
if(j != i){
h[a[j]]++;
}
}
int mex = -1;
for(int l = 0;l <= N;l++) if(!h[l]){
mex = l;
break;
}
New[i] = mex;
}
for(int i = 1;i <= n;i++) a[i] = New[i];
for(int i = 1;i <= n;i++) g[d].push_back(New[i]);
}
int pos1 , pos2;
for(int i = 0;i < 4;i++){
for(int j = i + 1;j < 4;j++){
if(check(i , j)){
pos1 = i , pos2 = j;
break;
}
}
}
int cnt = 0;
int len = pos2 - pos1;
int fr = pos1;
for(int i = pos1;i < pos2;i++){
for(auto j : g[i]) Ans[cnt].push_back(j);
++cnt;
}
if(k < pos1){
for(auto i : g[k]) printf("%lld " , i);
cout << endl;
}
else{
k -= fr;
k %= len;
for(auto i : Ans[k]) printf("%lld " , i);
cout << endl;
}
}
return 0;
}