/* vector< vector > Matrix(10, vector(20, -1)); iterator max_element(range); iterator min_element(range); sort ALLR descending string s istringstream is(s); is >> x; ostringstream os(s); os << x; for (auto x : container) { cout << x << endl; } for_each(v.begin(), v.end(), [&] (int x) { cout << x << endl; } ) */ /* ------------------------------------------------------------------ void dfs(int i) { if (!V[i]) { V[i] = true; for_each(all(W[i]), dfs); } } bool check_graph_connected_dfs() { int start_vertex = 0; V = vi(N, false); dfs(start_vertex); return (find(all(V), 0) == V.end()); } void add(int poz, int val) { for (; poz <= N; poz += zeroes(poz)) { aib[poz] += val; } } long long compute(int poz) { long long sum = 0; for (; poz; poz -= zeroes(poz)) { sum += aib[poz]; } return sum; } */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ONLINE_JUDGE const double epsilon = 1e-7; #define LL long long #define ULL unsigned long long typedef vector vi; typedef vector vl; typedef vector vvi; typedef vector vvl; typedef vector vd; typedef vector vs; typedef pair ii; typedef pair ll; typedef vector vii; typedef vector vll; #define all(V) V.begin(), V.end() #define allr(V) V.rbegin(), V.rend() #define for_c_it(container, it) for (auto it = container.begin(); it != container.end(); it++) #define present(container, element) (container.find(element) != container.end()) #define sz(a) int((a).size()) #define pb push_back #define mp make_pair #define zeroes(x) ((x ^ (x - 1)) & x) int N, M, K; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int i, j; cin >> K >> M >> N; if (N == 1 && M == K) { cout << (K * (K - 1)) / 2; for (i = 1; i < N; ++i) { for (j = i + 1; j <= N; ++j) { cout << '\n' << i << ' ' << j; } } return 0; } else if (N == K && M == 1) { cout << 0; } else if (M == 1) { int much = K - (N - 1); cout << much - 1; for (i = 1; i < much; ++i) { cout << '\n' << i << ' ' << i + 1; } } else if (N == 1) { int much = K - (M - 1); set< pair > SETT; //cout << much - 1; for (i = 1; i < much; ++i) { SETT.insert(mp(i, i + 1)); //cout << '\n' << i << ' ' << i + 1; } cout << (K * (K - 1)) / 2 - SETT.size(); for (i = 1; i < K; ++i) { for (j = i + 1; j <= K; ++j) { if (!(present(SETT, mp(i, j)))) { cout << '\n' << i << ' ' << j; } } } } else cout << "Impossible"; #ifndef ONLINE_JUDGE while (true); #endif return 0; }