ZOJ 4063 - Tournament
阿新 • • 發佈:2018-11-25
沒想到迴圈比賽日程表還有這種性質= =
直接分治打出迴圈比賽日程表,從第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; }