版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liufengwei1/article/details/84486066
没想到循环比赛日程表还有这种性质= =
直接分治打出循环比赛日程表,从第2行判断有没有问题,没有问题就输出= =
#include<bits/stdc++.h>
using namespace std;
int n,k;
bool flag;
int a[1030][1030];
inline void prework()
{
scanf("%d%d",&n,&k);
flag=true;
}
inline void mainwork()
{
if(n&1)
{
flag=false;
return;
}
int mi=1;
while(mi<n)
mi=mi*2;
memset(a,0,sizeof(a));
int half=1;
a[1][1]=1;
while(half<mi)
{
for(int i=1;i<=half;i++)
for(int j=1;j<=half;j++)
{
a[i+half][j+half]=a[i][j];
a[i+half][j]=a[i][j]+half;
a[i][j+half]=a[i][j]+half;
}
half<<=1;
}
for(int i=2;i<=k+1;i++)
for(int j=1;j<=n;j++)
if(a[i][j]==0 || a[i][j]>n)
{
flag=false;
return;
}
}
inline void print()
{
if(!flag)
puts("Impossible");
else
for(int i=2;i<=k+1;i++)
{
for(int j=1;j<=n;j++)
printf("%d%c",a[i][j],(j==n)?'\n':' ');
}
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}