Фибоначчи и его система счисления :-D

Написал в свое время программку для чисел Фибоначчи =] Делать было нечего, дело было вечером, а задание нашел интересное =] В итоге из-под рук вышло сие творение:

#include 

using namespace std;

typedef long long i64;/*64 бита*/

i64 fib[100], mas[100], fibc[100], N;

i64 recurs(i64 n, i64 N) {/**/
    if (N == 0 || N == 1)
        return N;

    if (N < fib[n-1])
        return recurs(n-1,N);
    else {
        N -= fib[n-1];
        return mas[n-1]+N+recurs(n-2,N);
    }
}

i64 rec(i64 r, i64 n, i64 N) {
    if (r <= 0)
        return 0;

    if (N < fib[n+1])
        return  rec(r-1, n-1, N);

    return 1+rec(r-2, n-2, N-fib[n+1]);
}

i64 main () {
    ifstream in("input.txt");
    ofstream out("output.txt");
    i64 Q = 0;

    fib[1]  = 1;
    mas[1]  = 1;
    fibc[1] = 1;
    for (i64 i = 2; i < 100; i++) {
        fib[i] = fib[i-1] + fib[i-2];
        mas[i] = fib[i] + fibc[i-2];
        fibc[i] = mas[i] + fibc[i-1];
    }
    in >> N;

    i64 n;
    for (n = 1; n * fib[n] <= N; n++)
        N -= n*fib[n], Q += mas[n];

    i64 tmp = N % n;
    N /= n;
    out << Q + recurs(n,N) + rec(tmp,n,N+fib[n+1]);

    return 0;
}

Программулина берет число Фибоначчи (точнее его порядковый номер), ищет его целочисленное значение и потом преобразует его в систему счисления Фибоначчи =]
Число на вход находится в файлике input.txt, а на выход — в файлике output.txt
По ходу движения мы рекурсивной функцией мы преобразуем число в двоичный код системы счисления Фибоначчи (исходя из правила, что 2 еденицы подряд идти не могут).

Собственно код уже описан выше — кому нужно — тот возмет =]

Пообсуждаем?