2018 ACM-ICPC 青島站 F 找規律打表
阿新 • • 發佈:2018-11-07
#include<bits/stdc++.h> using namespace std; const int maxn=1025; int dp[maxn][maxn],pre[maxn]; void init(int x1,int y1,int x2,int y2) { int now=x2-x1+1; if(now==1) { dp[x1][y1]=y1; return; } init(x1,y1,(x1+x2)>>1,(y1+y2)>>1); init(x1,(y1+y2+1)>>1,(x1+x2)>>1,y2); for(int i=(x1+x2+1)>>1;i<=x2;i++) for(int j=y1;j<=y2;j++) dp[i][j]=dp[i-(now>>1)][(j-y1+(now>>1))%now+y1]; } int main() { init(1,1,1024,1024); for(int i=1;i<maxn;i++) if(i&1) pre[i]=1; else pre[i]=pre[i/2]*2; int t,n,k; scanf("%d",&t); while(t--&&scanf("%d%d",&n,&k)!=EOF) if(k>=pre[n]) printf("Impossible\n"); else for(int i=2;i<=k+1;i++) { for(int j=1;j<n;j++) printf("%d ",dp[i][j]); printf("%d\n",dp[i][n]); } return 0; }