#include #include #include #include using namespace std; const int MAXN = 20; const int MAXK = 2000000; int n, m, sn; long long k; int a[MAXN][MAXN], back[MAXK]; vector > v1, v2; pair > srt[MAXK]; void generate (string currentStr, int lG, int rG, long long currentScore, vector >& vec) { if (lG == rG + 1) { vec.push_back(make_pair(currentScore, currentStr)); return ; } else { for(int i = 1; i <= n; i++) generate(currentStr + (char)('a' + (i - 1)), lG + 1, rG, currentScore + a[lG][i], vec); } } bool myCompare (const pair& self, const pair& other) { return (self.first > other.first || (self.first == other.first && self.second < other.second)); } long long getGoodPairs (long long middle) { long long goodPairs = 0; int pe = (int)v2.size() - 1; for(int i = 0; i < v1.size(); i++) { while (pe > 0 && v2[pe].first + v1[i].first < middle) --pe; if (v2[pe].first + v1[i].first >= middle) goodPairs += pe + 1; } return goodPairs; } int main(int argc, const char * argv[]) { //freopen("input.txt", "r", stdin); cin >> n >> m >> k; for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) cin >> a[i][j]; generate("", 1, m / 2, 0LL, v1); generate("", m / 2 + 1, m, 0LL, v2); sort(v1.begin(), v1.end(), &myCompare); sort(v2.begin(), v2.end(), &myCompare); long long left = 0, right = 10000000000LL; while (left < right) { long long middle = (left + right + 1) >> 1; long long goodPairs = getGoodPairs(middle); if (goodPairs >= k) left = middle; else right = middle - 1; } k -= getGoodPairs(left + 1); back[0] = 0; for(int i = 1; i < v2.size(); i++) if (v2[i].first != v2[i - 1].first) back[i] = i; else back[i] = back[i - 1]; int pe = (int)v2.size() - 1; for(int i = 0; i < v1.size(); i++) { while (pe > 0 && v2[pe].first + v1[i].first < left) --pe; if (v2[pe].first + v1[i].first == left) { int right = pe; int left = back[pe]; srt[++sn] = make_pair(v1[i].second, make_pair(left, right)); } } sort(srt + 1, srt + sn + 1); for(int i = 1; i <= sn; i++) { int left = srt[i].second.first; int right = srt[i].second.second; if (k > right - left + 1) k -= right - left + 1; else { cout << srt[i].first << v2[left + k - 1].second << endl; return 0; } } return 0; }