贪心
反证法
放在旧的柱子上一定比新开一个优
#include <cstring>
#include <cstdio>
#include <vector>
std::vector<int> d[60];
int n,ans=1,cnt;
bool sqr[5005];
int main() {
scanf("%d",&n);
for(int i=1;i*i<=5000;i++) sqr[i*i]=1;
while(1){
for(int i=1;i<=cnt;i++){
if(sqr[d[i][d[i].size()-1]+ans]){d[i].push_back(ans);ans++;i=0;continue;}
}
if(cnt<n) d[++cnt].push_back(ans++);else break;
}
printf("%d\n",ans-1);
for(int i=1;i<=n;i++){
for(int j=0;j<d[i].size();j++)
printf("%d ",d[i][j]);
printf("\n");
}
}