#include using namespace std; using int64 = long long; int main() { int64 N, K; cin >> N >> K; int64 M = N / K; if(N == 1) { cout << "Yes" << endl; cout << 1 << endl; return 0; } if(N == K) { cout << "No" << endl; return 0; } // Nが偶数かつMが奇数のとき,sum%Kが非0なので解なし if(N % 2 == 0 && M % 2 == 1) { cout << "No" << endl; return 0; } // それ以外は解を構成可能 cout << "Yes" << endl; if(M % 2 == 0) { // K個のペアを偶数個作れるので両端からとっていけばよい // abcde abcde ... dcba dcba deque< int > tap(N); iota(begin(tap), end(tap), 1); vector< vector< int > > ans(K); while(tap.size()) { for(int k = 0; k < K; k++) { ans[k].emplace_back(tap.front()); ans[k].emplace_back(tap.back()); tap.pop_front(); tap.pop_back(); } } for(auto &p : ans) { for(int k = 0; k < p.size(); k++) cout << p[k] << " "; cout << endl; } } else { vector< vector< int > > ans(K); int64 rest = 3 * K * (3 * K + 1) / 2; rest /= K; for(int i = 0; i < K; i++) { ans[i].emplace_back(i + 1); ans[i].emplace_back(K + 1 + (K / 2 + i) % K); ans[i].emplace_back(rest - ans[i][0] - ans[i][1]); } deque< int > tap(N - 3 * K); iota(begin(tap), end(tap), 3 * K + 1); while(tap.size()) { for(int k = 0; k < K; k++) { ans[k].emplace_back(tap.front()); ans[k].emplace_back(tap.back()); tap.pop_front(); tap.pop_back(); } } for(auto &p : ans) { for(int k = 0; k < p.size(); k++) cout << p[k] << " "; cout << endl; } } }