/* -*- coding: utf-8 -*- * * 3211.cc: No.3211 NAND Oracle - yukicoder */ #include #include #include #include using namespace std; /* constant */ const int MAX_N = 200000; /* typedef */ using vi = vector; using pii = pair; using vpii = vector; /* global variables */ /* subroutines */ void rec(int qn, int k, vi avs[], int ss[], vpii &ops) { if (ops.size() >= qn) { puts("Yes"); for (auto [i, j]: ops) printf("%d %d\n", i + 1, j + 1); exit(0); } int n = ops.size() + 2; for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) { int maxs = 0, ss1[4]; for (int l = 0; l < 4; l++) { int al = (avs[l][i] & avs[l][j]) ^ 1; ss1[l] = ss[l] + al; maxs = max(maxs, ss1[l]); avs[l].push_back(al); } if (maxs <= k) { ops.push_back({i, j}); rec(qn, k, avs, ss1, ops); ops.pop_back(); } for (int l = 0; l < 4; l++) avs[l].pop_back(); } } /* main */ int main() { int qn, k; scanf("%d%d", &qn, &k); // 1,2 2,3 1,4 1,5 1,5 6,7 // 00->001->0011->00111->001111->0011111->00111110->.. // 01->011->0110->01101->011011->0110111->01101110->.. // 10->101->1011->10110->101101->1011011->10110110->.. // 11->110->1101->11010->110101->1101011->11010110->.. if (k >= 5) { puts("Yes"); for (int i = 0; i < qn; i++) switch (i) { case 0: puts("1 2"); break; case 1: puts("2 3"); break; case 2: puts("1 4"); break; case 3: puts("1 5"); break; case 4: puts("1 5"); break; default: puts("6 7"); } return 0; } vi avs[4] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}}; int ss[4] = {0, 1, 1, 2}; vpii ops; rec(qn, k, avs, ss, ops); puts("No"); return 0; }