Etichete: nicio etichetă
#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;
}

Du-te sus!