题解 CF1716B
题解 CF1716B
这是一个纯纯的构造题
我们要构造 n
个序列,每个序列他的元素 \(a_i\) 在第 i
个位置上的数量都应该比上一个序列的数量
并且这种序列只能通过交换两个数字来获取
所以,我们应该直接每次找到两个不同的数字,直接交换即可
这里的第一次我们直接输出原序列
然后每次循环找与下标不同的元素
因为如果是找到的第一个,肯定不能交换,因为这是第一个,我们可以没有与他交换的其他元素
这里特判一下就行了
#include<cstdio>
#include<string.h>
using namespace std;
int T;
int a[110];
void Swap(int &x,int &y){
int t=x;
x=y;
y=t;
return ;
}
int main(){
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
int n;
scanf("%d",&n);
printf("%d\n",n);
for(int i=1;i<=n;i++){
a[i]=i;
printf("%d ",i);
}
puts("");
int f=0;
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(a[i]==i && !f){
f=i;
}else if(a[i]==i && f){
Swap(a[f],a[i]);
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
puts("");
}
}
}
}
return 0;
}