#include <iostream>
using namespace std;
#define lim 501
void citire(int &n, int a[][lim]){
cin >> n;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin >> a[i][j];
}
int nrFib[47];
void cautaFib(){
int f1 = 0, f2 = 1;
nrFib[1] = f1;
nrFib[2] = f2;
for(int i=3; i<=46; i++){
int f3 = f1 + f2;
nrFib[i] = f3;
f1 = f2, f2 = f3;
}
}
bool isRotund(int num){
int freq[2] = {0};
do{
freq[num % 2]++;
num/=2;
}while(num);
if(freq[0] == freq[1])
return true;
return false;
}
bool esteFib(int num){
int left = 1, right = 46;
while(left <= right){
int mid = (left + right) / 2;
if(nrFib[mid] == num)
return true;
else
if(nrFib[num] < num)
left = mid + 1;
else
right = mid - 1;
}
return false;
}
void cautaToElim(int n, int a[][lim], bool listToElim[]){
for(int j=1; j<=n; j++){
int ct = 0;
for(int i=1; i<=n; i++)
if(esteFib(a[i][j]))
ct++;
if(isRotund(ct))
listToElim[j] = true;
}
}
void eliminaCol(int n, int &m, int a[][lim], bool listToElim[]){
int nrs = 0;
for(int j=1; j<=n; j++)
if(listToElim[j])
nrs++;
else
for(int i=1; i<=n; i++)
a[i][j-nrs] = a[i][j];
m -= nrs;
}
void display(int n, int m, int a[][lim]){
if(n == m)
cout << "Nu s-a efectuat nicio stergere.";
else
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++)
cout << a[i][j] << " ";
cout << "\n";
}
}
int main()
{
int n, a[lim][lim];
citire(n, a);
cautaFib();
bool listToElim[lim] = {0};
cautaToElim(n, a, listToElim);
int m = n;
eliminaCol(n, m, a, listToElim);
display(n, m, a);
return 0;
}