#include <cmath> #include <iostream> #include <algorithm> #include <iostream> #include <map> #include <utility> #include <vector> using namespace std; using Koncowki = map< int, int >; using Graf = vector< pair< int, int > >; const int max_k = 1'000'000'000; auto przygotuj(int const k) { Graf g(300, {-1, -1}); Koncowki km; // glowa grafu g[1] = {2, 3}; g[2] = {3, 4}; int w = 2; int moc = 1; while( moc <= k ) { g[ w+0 ] = { w+2, w+4 }; g[ w+2 ] = { w+3, -1 }; g[ w+1 ] = { w+3, w+4 }; km[moc] = w+2; w += 3; moc *= 2LL; } g[w+2] = { -1, -1 }; g.resize(w+3); return make_tuple(g, km); } void rozwiaz(int k, Graf& g, Koncowki& km) { int dzielnik = pow(2, 29); int ostatni = g.size() - 1; while(dzielnik) { int podzial = k / dzielnik; if(podzial) { g[ km[dzielnik] ].second = ostatni; k %= dzielnik; } dzielnik /= 2; } } void drukuj(Graf const& g) { cout << (g.size() - 1) << "\n"; for(int i = 1; i < g.size(); ++i ) { cout << g[i].first << " " << g[i].second << "\n"; } } int main() { int k; cin >> k; auto [g, km] = przygotuj(k); rozwiaz(k, g, km); drukuj(g); }
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 | #include <cmath> #include <iostream> #include <algorithm> #include <iostream> #include <map> #include <utility> #include <vector> using namespace std; using Koncowki = map< int, int >; using Graf = vector< pair< int, int > >; const int max_k = 1'000'000'000; auto przygotuj(int const k) { Graf g(300, {-1, -1}); Koncowki km; // glowa grafu g[1] = {2, 3}; g[2] = {3, 4}; int w = 2; int moc = 1; while( moc <= k ) { g[ w+0 ] = { w+2, w+4 }; g[ w+2 ] = { w+3, -1 }; g[ w+1 ] = { w+3, w+4 }; km[moc] = w+2; w += 3; moc *= 2LL; } g[w+2] = { -1, -1 }; g.resize(w+3); return make_tuple(g, km); } void rozwiaz(int k, Graf& g, Koncowki& km) { int dzielnik = pow(2, 29); int ostatni = g.size() - 1; while(dzielnik) { int podzial = k / dzielnik; if(podzial) { g[ km[dzielnik] ].second = ostatni; k %= dzielnik; } dzielnik /= 2; } } void drukuj(Graf const& g) { cout << (g.size() - 1) << "\n"; for(int i = 1; i < g.size(); ++i ) { cout << g[i].first << " " << g[i].second << "\n"; } } int main() { int k; cin >> k; auto [g, km] = przygotuj(k); rozwiaz(k, g, km); drukuj(g); } |