做法:先初始一个解,然后随机两个元素交换,看看能不能达到目标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<bits/stdc++.h> using namespace std; int bn[1000005],n,m,t,a[1000005],cur,sum; mt19937 rd(102624); int check(){ for(int i=1;i<=8000;++i){ int x=rd()%m+1,y=rd()%(n-m)+m+1; sum^=a[x];sum^=a[y]; swap(a[x],a[y]); if(sum==cur)return 1; } return 0; } int main(){ ios::sync_with_stdio(0);cin.tie(0); cin>>t; for(int i=1;i<=1000000;++i)bn[i]=bn[i-1]+(1<<bn[i-1]==i); while(t--){ cin>>n>>m; for(int i=1;i<=n;++i)a[i]=i; cur=1; for(int i=1;i<=bn[n];++i)cur<<=1; --cur;sum=0; for(int i=1;i<=m;++i)sum^=a[i]; if(n==m){ int s1=0; for(int i=1;i<=n;++i)s1^=i; if(s1!=cur)cout<<"-1\n"; else{ for(int i=1;i<=n;++i)cout<<i<<' '; cout<<'\n'; } continue; } for(int i=1;i<=70;++i){ if(check()){ for(int i=1;i<=m;++i)cout<<a[i]<<' '; cout<<'\n'; goto ed; } } cout<<"-1\n"; ed:; } return 0; }
|