循环赛日程表
一道分治典型题
链接:我不知道
------------------------------
如果把一个表分成四分,就很容易观察到规律
-------------------------------
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int ma[1025][1025]; int n; int k; int temp; void dfs(int n){ if(n==2){ ma[1][1]=1; ma[1][2]=2; ma[2][1]=2; ma[2][2]=1; return ; } else{ dfs(n/2); int z=n/2; for(int i=1;i<=z;++i){ for(int j=1;j<=z;++j){ ma[i+z][j]=ma[i][j]+z; ma[i][j+z]=ma[i][j]+z; ma[i+z][j+z]=ma[i][j]; } } return ; } } int mi(int k){ int ans=1; int temp=2; while(k){ if(k%2){ ans*=temp; } temp+=temp; k=k>>1; } return ans; } int main(){ cin>>k; n=mi(k); dfs(n); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ printf("%d ",ma[i][j]); } cout<<endl; } return 0; }