Problem:
問題 F : 全域木
今，G○○gle Code Jam の地区大会が始まろうとしている．
左の席に座っている男の ID は wata と言うらしい．
東京大学時代の記憶に，似たような ID の仲間が居た覚えがある．
しかし，僕の仲間は一人残さず美少女だったはずだ．
僕の記憶の中の wata は，マトロイドが好きだった．
特に，マトロイド交差が大好きで，
様々なマトロイド達を交差させることに一種の興奮すら覚えると言う少し変わった奴だった．
マトロイドの理論の力を使えば，
与えられたグラフ上で辺を共有しない複数の全域木を求めることはとても簡単な問題だと言っていた気がする．
しかし，特別なグラフに関しては，
マトロイドのアルゴリズムを直接に適用するよりも高速なアルゴリズムがあるのではないか？
問題
N
個の頂点からなる完全グラフにおいて，
辺を共有しない全域木を
K
個作成せよ．
完全グラフとは，全ての相異なる 2 頂点間に 1 本の辺を持つグラフである．
下図は，4 頂点の完全グラフの例である．
4 頂点の完全グラフ．
全域木とは，元のグラフの全ての頂点と一部の辺からなる木のことである．
木とは，連結かつ閉路を持たないグラフのことである．
下図は，4 頂点の完全グラフにおける，辺を共有しない 2 つの全域木である．
4 頂点の完全グラフの全域木の例．
4 頂点の完全グラフの全域木であり，前の例と辺を共有しないもの．
入力
入力は 1 行からなり，
2 つの整数
N
,
K
が書かれている．
出力
条件を満たす
K
個の全域木を作ることができない時，-1 とだけ出力せよ．
条件を満たす
K
個の全域木を作ることができる時，
K
個の全域木を改行で区切り出力せよ．
1 つの全域木は
N
- 1
行で表される．
その
i
行目には，その全域木の辺
i
が結ぶ 2 つの頂点を表す 2 つの整数をスペースで区切り出力する．
ここで，頂点は
1
から
N
までの整数で表すものとする．
制約
2 ≤
N
≤ 10000
1 ≤
K
≤ 100
部分点
この問題の判定には，20 点分のテストケースのグループが設定されている．
このグループに含まれるテストケースの入力は以下を満たす．
1 ≤
N
≤ 8
入出力例
入出力例 1
入力例 1:
4 2
入力例 1 に対する出力の例:
1 2
1 4
2 3

1 3
2 4
3 4
この入出力例は問題文中の図と対応している．
入出力例 2
入力例 2:
4 3
入力例 2 に対する出力の例:
-1

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;

int main() {
  int n,k;
  cin >> n >> k;
  if(k>n/2){
    cout << -1 << endl;
    return 0;
  }
  vector<vector<string>> ans(k);
  for(int i=0;i<n;i++){
    for(int j=i+1;j<n;j++){
      int id=((i+j)%n)/2;
      if(id<k){ 
        string s=to_string(i+1)+" "+to_string(j+1)+"\n";
        ans[id].push_back(s);
      }
    }
  }
  for(int i=0;i<k;i++){
    for(int j=0;j<n-1;j++) cout << ans[i][j];
    if(i!=k-1) cout << endl;
  }
}
accuracy: 1
time_ms: 250
memory_kb: 37448
final_rank: 20

code_snippet: #include <iostream>
#include <vector>
#include <sstream>
using namespace std;

int main() {
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1" << endl;
      continue;
    }
    vector<int> p(n + 2);
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    stringstream ss;
    for (int i = 0; i < k; i++) {
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        ss << ((i != 0 && j == 0) ? "\n" : "") << a << " " << b << ((j < n - 2) ? "\n" : "");
      }
    }
    cout << ss.str();
  }
}
accuracy: 1
time_ms: 90
memory_kb: 22228
final_rank: 19

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, k;
    while (cin >> n >> k) {
        if (n / 2 < k) {
            cout << -1 << '\n';
            continue;
        }
        
        vector<int> p(n + 2);
        p[0] = 0;
        for (int i = 1; i < n; i += 2) {
            p[i] = i / 2 + 1;
            p[i + 1] = n - p[i];
        }
        
        vector<int> a_values(n-1), b_values(n-1);
        for (int i = 0; i < k; i++) {
            if (i != 0)
                cout << '\n';
            for (int j = 0; j < n - 1; j++) {
                a_values[j] = (p[j] + i) % n + 1;
                b_values[j] = (p[j + 1] + i) % n + 1;
            }
            for (int j = 0; j < n - 1; j++) {
                cout << a_values[j] << " " << b_values[j] << '\n';
            }
        }
    }
    return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 3204
final_rank: 17

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    vector<int> p(n + 2);
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      if (i != 0)
        cout << "\n";
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        cout << a << " " << b << "\n";
      }
    }
  }
  return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 3124
final_rank: 14

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
  ios_base::sync_with_stdio(false); // boost performance when using cin and cout
  int n, k;
  vector<int> p; // dynamic array to avoid unnecessary initializations
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    if (p.size() < n + 2) // resize the array only if necessary
      p.resize(n + 2);
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        if (j != 0)
          cout << '\n'; // use '\n' instead of endl to avoid unnecessary buffer flushes
        cout << a << ' ' << b;
      }
      cout << '\n'; // print a newline at the end of each block
    }
  }
  return 0;
}
accuracy: 1
time_ms: 80
memory_kb: 3252
final_rank: 9

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
  ios::sync_with_stdio(false);  // Disable synchronization of C++ and C standard streams
  cin.tie(NULL);  // Unties cin from cout

  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    vector<int> p(n + 2);  // Use a vector instead of an array
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      if (i != 0)
        cout << "\n";
      
      int a, b;
      for (int j = 0; j < n - 1; j++) {
        a = (p[j] + i) % n + 1;
        b = (p[j + 1] + i) % n + 1;
        cout << a << " " << b << "\n";
      }
    }
  }

  return 0;
}
accuracy: 1
time_ms: 80
memory_kb: 3208
final_rank: 6

code_snippet: #include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main() {
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    vector<int> p(n + 2);
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    stringstream ss;
    for (int i = 0; i < k; i++) {
      if (i != 0)
        ss << "\n";
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        ss << a << " " << b << "\n";
      }
    }
    cout << ss.str();
  }
}
accuracy: 1
time_ms: 80
memory_kb: 22252
final_rank: 18

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    vector<int> p(n + 2);
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      vector<int> a(n - 1), b(n - 1);
      for (int j = 0; j < n - 1; j++) {
        a[j] = p[j] + i;
        if (a[j] >= n) a[j] -= n;
        a[j]++;
        b[j] = p[j + 1] + i;
        if (b[j] >= n) b[j] -= n;
        b[j]++;
      }
      for (int j = 0; j < n - 1; j++) {
        cout << a[j] << " " << b[j] << "\n";
      }
      if (i != k - 1) cout << "\n";
    }
  }
  return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 3196
final_rank: 16

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    vector<int> p(n + 2);
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      if (i != 0)
        cout << "\n";
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        cout << a << " " << b << "\n";
      }
    }
  }
}
accuracy: 1
time_ms: 90
memory_kb: 3204
final_rank: 10

code_snippet: #include <iostream>
using namespace std;

int main() {
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    int* p = new int[n + 2];
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      if (i != 0)
        cout << "\n";
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        cout << a << " " << ((p[j + 1] + i) % n + 1) << "\n";
      }
    }
    delete[] p;
  }
  return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 3112
final_rank: 13

code_snippet: #include <iostream>
using namespace std;

int main() {
    int n, k;
    while (cin >> n >> k) {
        if (n / 2 < k) {
            cout << "-1\n";
            continue;
        }
        int p[n];
        p[0] = 0;
        for (int i = 1; i < n; i += 2) {
            p[i] = i / 2 + 1;
            p[i + 1] = n - p[i];
        }
        for (int i = 0; i < k; i++) {
            if (i != 0) 
                cout << "\n";
            for (int j = 0; j < n - 1; j++) {
                int a = (p[j] + i) % n + 1;
                int b = (p[j + 1] + i) % n + 1;
                cout << a << " " << b << "\n";
            }
        }
    }
    return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 3092
final_rank: 12

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    vector<int> p(n + 2);
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      if (i != 0)
        cout << "\n";
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        cout << a << " " << b << "\n";
      }
    }
  }
}
accuracy: 1
time_ms: 80
memory_kb: 3208
final_rank: 6

code_snippet: #include <cstdio>
#include <iostream>
using namespace std;
int main() {
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      printf("-1\n");
      continue;
    }
    int p[n + 2];
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k * (n - 1); i++) {
      if (i != 0 && i % (n - 1) == 0)
        printf("\n");
      int j = i % (n - 1);
      int a = (p[j] + i / (n - 1)) % n + 1;
      int b = (p[j + 1] + i / (n - 1)) % n + 1;
      printf("%d %d\n", a, b);
    }
  }
}
accuracy: 1
time_ms: 90
memory_kb: 3244
final_rank: 11

code_snippet: #include <cstdio>
using namespace std;

int main() {
  int n, k;
  while (scanf("%d %d", &n, &k) == 2) {
    if (n / 2 < k) {
      printf("-1\n");
    }
    else {
      int p[n + 2];
      p[0] = 0;
      for (int i = 1; i < n; i += 2) {
        p[i] = i / 2 + 1;
        p[i + 1] = n - p[i];
      }
      for (int i = 0; i < k; i++) {
        if (i != 0)
          printf("\n");
        int a, b;
        for (int j = 0; j < n - 1; j++) {
          a = (p[j] + i) % n + 1;
          b = (p[j + 1] + i) % n + 1;
          printf("%d %d\n", a, b);
        }
      }
    }
  }
  return 0;
}
accuracy: 1
time_ms: 70
memory_kb: 2768
final_rank: 1

code_snippet: #include <iostream>

int main() {
  int n, k;
  while (std::cin >> n >> k) {
    if (n / 2 < k) {
      std::cout << "-1\n";
      continue;
    }
    int p[n + 2];
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; ++i) {
      if (i != 0)
        std::cout << '\n';
      int a = (p[0] + i) % n + 1;
      for (int j = 0; j < n - 1; ++j) {
        int b = (p[j + 1] + i) % n + 1;
        std::cout << a << ' ' << b << '\n';
        a = b;
      }
    }
  }
}
accuracy: 1
time_ms: 100
memory_kb: 3128
final_rank: 15

code_snippet: #include <cstdio>
#include <iostream>
using namespace std;

int main() {
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      printf("-1\n");
      continue;
    }
    int p[n];
    p[0] = 0;
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      if (i != 0)
        printf("\n");
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        printf("%d %d\n", a, b);
      }
    }
  }
}
accuracy: 1
time_ms: 70
memory_kb: 3256
final_rank: 2

code_snippet: #include <iostream>
#include <vector>

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
  
    int n, k;
    while (std::cin >> n >> k) {
        if (n / 2 < k) {
            std::cout << "-1\n";
            continue;
        }
        std::vector<int> p(n + 2);
        for (int i = 1; i < n; i += 2) {
            p[i] = i / 2 + 1;
            p[i + 1] = n - p[i];
        }
        for (int i = 0; i < k; i++) {
            for (int j = 0; j < n - 1; j++) {
                int a = (p[j] + i) % n + 1;
                int b = (p[j + 1] + i) % n + 1;
                if (j != 0) std::cout << '\n';
                std::cout << a << ' ' << b;
            }
            std::cout << '\n';
        }
    }
}
accuracy: 1
time_ms: 80
memory_kb: 3192
final_rank: 3

code_snippet: #include <iostream>
#include <vector>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, k;
    while (cin >> n >> k) {
        if (n / 2 < k) {
            cout << "-1\n";
            continue;
        }
        vector<int> p(n + 2);
        p[0] = 0;
        for (int i = 1; i < n; i += 2) {
            p[i] = i / 2 + 1;
            p[i + 1] = n - p[i];
        }
        for (int i = 0; i < k; i++) {
            if (i != 0)
                cout << "\n";
            for (int j = 0; j < n - 1; j++) {
                int a = (p[j] + i) % n + 1;
                int b = (p[j + 1] + i) % n + 1;
                cout << a << " " << b << "\n";
            }
        }
    }
    return 0;
}
accuracy: 1
time_ms: 80
memory_kb: 3236
final_rank: 8

code_snippet: #include <iostream>
#include <vector>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, k;
  while (cin >> n >> k) {
    if (n / 2 < k) {
      cout << "-1\n";
      continue;
    }
    vector<int> p(n + 2);
    for (int i = 1; i < n; i += 2) {
      p[i] = i / 2 + 1;
      p[i + 1] = n - p[i];
    }
    for (int i = 0; i < k; i++) {
      for (int j = 0; j < n - 1; j++) {
        int a = (p[j] + i) % n + 1;
        int b = (p[j + 1] + i) % n + 1;
        if (j > 0) cout << "\n";
        cout << a << " " << b;
      }
      cout << "\n";
    }
  }
}
accuracy: 1
time_ms: 80
memory_kb: 3204
final_rank: 5

code_snippet: #include <iostream>
#include <vector>

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int n, k;
    while (std::cin >> n >> k) {
        if (n / 2 < k) {
            std::cout << "-1\n";
            continue;
        }
        std::vector<int> p(n + 2);
        for (int i = 1; i < n; i += 2) {
            p[i] = i / 2 + 1;
            p[i + 1] = n - p[i];
        }
        for (int i = 0; i < k; i++) {
            for (int j = 0; j < n - 1; j++) {
                int a = (p[j] + i) % n + 1;
                int b = (p[j + 1] + i) % n + 1;
                std::cout << a << " " << b << '\n';
            }
        }
    }
    return 0;
}
accuracy: 1
time_ms: 80
memory_kb: 3192
final_rank: 3