#include <bits/stdc++.h> using namespace std; typedef long long ll; #define LIM 50 int next_node, n = 100, k, start_fib = 50, start_dist = 16; //int next_node, n = 20, k, start_fib = 10, start_dist = 4; int res[107][2]; ll base[LIM + 1]; ll fib[LIM + 1]; void construct_fib(){ res[start_fib][0] = n; res[start_fib+1][0] = start_fib; res[start_fib+1][1] = n; for(int i = start_fib + 2; i < 100; i++){ res[i][0] = i-1; res[i][1] = i-2; } } void construct_dist(){ for(int i = 1; i < start_dist; i++){ res[i][0] = 2 * i; res[i][1] = 2 * i + 1; } } void connect(){ next_node = start_dist; int leg = 0; for(int i = 0; i <LIM; i++){ if (base[i]){ res[next_node][leg] = i + start_fib - 2; if (leg){ leg = 0; next_node++; } else{ leg++; } } } } int main(){ fib[1] = 1; fib[2] = 1; for(int i = 3; i<=LIM;i++){ fib[i] = fib[i-1] + fib[i-2]; } construct_fib(); construct_dist(); //printf("first couple of fib numbers:\n"); /*for(int i = 1; i < 10; i++){ printf("%lld\t", fib[i]); })*/ // fib 45 is already more than I need scanf("%d", &k); //printf("\n%d in fib base:\n", k); int idx = LIM; while(k>0){ while(fib[idx] > k) idx--; while(idx && fib[idx] <= k){ base[idx]++; k-= fib[idx]; } } // max 23 fibits on, as fib two consecutive fibits cannot be on /* for(int i = 1; i < 10; i++){ printf("%d\t",base[i]); } for(int i = LIM; i >= 0; i--){ if (base[i]){ printf("highest fibit on: %d\n", i); break; } } printf("\n");*/ connect(); printf("%d\n", n); for(int i = 1; i<=n;i++){ for(int j = 0; j < 2; j++){ if (!res[i][j]) res[i][j] = -1; } printf("%d %d\n", res[i][0], res[i][1]); } }
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #define LIM 50 int next_node, n = 100, k, start_fib = 50, start_dist = 16; //int next_node, n = 20, k, start_fib = 10, start_dist = 4; int res[107][2]; ll base[LIM + 1]; ll fib[LIM + 1]; void construct_fib(){ res[start_fib][0] = n; res[start_fib+1][0] = start_fib; res[start_fib+1][1] = n; for(int i = start_fib + 2; i < 100; i++){ res[i][0] = i-1; res[i][1] = i-2; } } void construct_dist(){ for(int i = 1; i < start_dist; i++){ res[i][0] = 2 * i; res[i][1] = 2 * i + 1; } } void connect(){ next_node = start_dist; int leg = 0; for(int i = 0; i <LIM; i++){ if (base[i]){ res[next_node][leg] = i + start_fib - 2; if (leg){ leg = 0; next_node++; } else{ leg++; } } } } int main(){ fib[1] = 1; fib[2] = 1; for(int i = 3; i<=LIM;i++){ fib[i] = fib[i-1] + fib[i-2]; } construct_fib(); construct_dist(); //printf("first couple of fib numbers:\n"); /*for(int i = 1; i < 10; i++){ printf("%lld\t", fib[i]); })*/ // fib 45 is already more than I need scanf("%d", &k); //printf("\n%d in fib base:\n", k); int idx = LIM; while(k>0){ while(fib[idx] > k) idx--; while(idx && fib[idx] <= k){ base[idx]++; k-= fib[idx]; } } // max 23 fibits on, as fib two consecutive fibits cannot be on /* for(int i = 1; i < 10; i++){ printf("%d\t",base[i]); } for(int i = LIM; i >= 0; i--){ if (base[i]){ printf("highest fibit on: %d\n", i); break; } } printf("\n");*/ connect(); printf("%d\n", n); for(int i = 1; i<=n;i++){ for(int j = 0; j < 2; j++){ if (!res[i][j]) res[i][j] = -1; } printf("%d %d\n", res[i][0], res[i][1]); } } |