#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); } |
English