1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<cstdio>

static const int fib[] = {1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733};
static const int s = 43;

static int tab[100][2];
static int stos[100];
static int wsk = 0;

int main(){
    int k;
    scanf("%i", &k);

    tab[0][0] = -1;
    tab[0][1] = -1;
    tab[1][0] = 0;
    tab[1][1] = -1;

    int f = s - 1;
    while(fib[f] > k){
        --f;
    }
    ++f;

    for(int i = f; i > 1; --i){
        tab[i][0] = i - 1;
        tab[i][1] = i - 2;
    }


    int k2 = k;

    for(int i = f - 1; i >= 0; --i){
        if(k2 >= fib[i]){
            k2 -= fib[i];
            stos[wsk++] = i;
            if(!k2){
                break;
            }
        }
    }

    int n = wsk + f;

    for(int i = n - 1; i > f; --i){
        tab[i][0] = i - 1;
        tab[i][1] = stos[--wsk] + 1;
    }

    printf("%i\n", n);

    for(int i = n - 1; i >= 0; --i){
        if(tab[i][0] < 0){
            printf("-1 ");
        }
        else{
            printf("%i ", n - tab[i][0]);
        }

        if(tab[i][1] < 0){
            printf("-1\n");
        }
        else{
            printf("%i\n", n - tab[i][1]);
        }
    }

    return 0;
}