题目链接:https://vjudge.net/problem/ZOJ-4063
解题思路:
当k<lowbit(n)时无解,否则按循环赛程的顺序输出前k行前n个就是了,因为只有前lowbit(n)行在循环赛程中是没变的,其他都发生了改变不会出现a打b,c打d之后若有a打c那么就一定有b打d
#include <bits/stdc++.h>
using namespace std;
const int mx = 1e3 + 200;
int num[mx][mx];
void init()
{
int bit = 10,N = 1<<bit;
for(int i=1;i<=N;i++) num[1][i] = i;
for(int len=0;len<bit;len++){
int k = 1<<len;
for(int i=k+1;i<=2*k;i++){
int q = 1<<(len+1);
for(int j=1;j<=N;j+=q)
{
for(int p=j;p<j+k;p++) num[i][p] = num[i-k][p+k];
for(int p=j+k;p<j+2*k;p++) num[i][p] = num[i-k][p-k];
}
}
}
}
int lowbit(int x)
{
return x&(-x);
}
int main()
{
int t,n,m;
scanf("%d",&t);
init();
while(t--){
scanf("%d%d",&n,&m);
if(m>=lowbit(n))
{
puts("Impossible");
continue;
}
for(int i=2;i<=m+1;i++){
for(int j=1;j<=n;j++){
printf("%d%c",num[i][j],j==n?'\n':' ');
}
}
}
return 0;
}