#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
void inputRoutine( vector<int> &a )
{
const int MAXNUM = 17;
for ( int i = 1; i <= MAXNUM; i++ ) a.push_back( i );
}
void printRoutine(int COLS, vector<int> a, vector<int>& row_sum)
{
int size = a.size();
int fullrows = size / COLS;
int leftover = size % COLS;
int rows = fullrows + ( leftover != 0 );
row_sum.resize(rows);
cout << "TABLE:\n";
for ( int i = 0; i < rows; i++ )
{
int indexTop = 0;
for ( int j = 0; j < COLS; j++ )
{
int index = indexTop + i;
if ( i < fullrows || j < leftover )
{
cout << a[index];
row_sum[i] += a[index];
}
cout << '\t';
if ( j < leftover ) indexTop += rows; // top-of-column 1-d index for the number in this column
else indexTop += fullrows;
}
cout << '\n';
}
if (COLS == 1)
{
row_sum[0] = std::accumulate(std::begin(row_sum), std::end(row_sum), 0);
row_sum.resize(1);
}
}
int main()
{
vector<int> a;
inputRoutine( a );
for (int COLS = 1; COLS < 6; ++COLS)
{
vector<int> row_sum;
printRoutine( COLS, a, row_sum );
std::cout << '\n' << COLS << '\t';
for (int i : row_sum)
std::cout << i << ' ';
std::cout << std::endl;
std::cout << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgaW5wdXRSb3V0aW5lKCB2ZWN0b3I8aW50PiAmYSApCnsKICAgY29uc3QgaW50IE1BWE5VTSA9IDE3OwogICBmb3IgKCBpbnQgaSA9IDE7IGkgPD0gTUFYTlVNOyBpKysgKSBhLnB1c2hfYmFjayggaSApOwp9CgoKdm9pZCBwcmludFJvdXRpbmUoaW50IENPTFMsIHZlY3RvcjxpbnQ+IGEsIHZlY3RvcjxpbnQ+JiByb3dfc3VtKQp7CiAgIGludCBzaXplID0gYS5zaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgaW50IGZ1bGxyb3dzID0gc2l6ZSAvIENPTFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGludCBsZWZ0b3ZlciA9IHNpemUgJSBDT0xTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgaW50IHJvd3MgPSBmdWxscm93cyArICggbGVmdG92ZXIgIT0gMCApOyAgICAgICAgICAgICAgICAgICAgCgogICByb3dfc3VtLnJlc2l6ZShyb3dzKTsKCiAgIGNvdXQgPDwgIlRBQkxFOlxuIjsKICAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIHsKICAgICAgaW50IGluZGV4VG9wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBDT0xTOyBqKysgKQogICAgICB7CiAgICAgICAgIGludCBpbmRleCA9IGluZGV4VG9wICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgaWYgKCBpIDwgZnVsbHJvd3MgfHwgaiA8IGxlZnRvdmVyICkKICAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8IGFbaW5kZXhdOwogICAgICAgICAgICByb3dfc3VtW2ldICs9IGFbaW5kZXhdOwogICAgICAgICB9CiAgICAgICAgIGNvdXQgPDwgJ1x0JzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgaWYgKCBqIDwgbGVmdG92ZXIgKSBpbmRleFRvcCArPSByb3dzOyAvLyB0b3Atb2YtY29sdW1uIDEtZCBpbmRleCBmb3IgdGhlIG51bWJlciBpbiB0aGlzIGNvbHVtbgogICAgICAgICBlbHNlICAgICAgICAgICAgICAgIGluZGV4VG9wICs9IGZ1bGxyb3dzOyAgICAgICAgICAgICAgCiAgICAgIH0KICAgICAgY291dCA8PCAnXG4nOwogICB9CiAgIAogICBpZiAoQ09MUyA9PSAxKQogICB7CiAgIAkgIHJvd19zdW1bMF0gPSBzdGQ6OmFjY3VtdWxhdGUoc3RkOjpiZWdpbihyb3dfc3VtKSwgc3RkOjplbmQocm93X3N1bSksIDApOwogICAJICByb3dfc3VtLnJlc2l6ZSgxKTsKICAgfQp9CgoKaW50IG1haW4oKQp7CiAgIHZlY3RvcjxpbnQ+IGE7CiAgIGlucHV0Um91dGluZSggYSApOwogICAKICAgZm9yIChpbnQgQ09MUyA9IDE7IENPTFMgPCA2OyArK0NPTFMpCiAgIHsKICAgICAgdmVjdG9yPGludD4gcm93X3N1bTsKICAgICAgcHJpbnRSb3V0aW5lKCBDT0xTLCBhLCByb3dfc3VtICk7CiAgIAogICAgICBzdGQ6OmNvdXQgPDwgJ1xuJyA8PCBDT0xTIDw8ICdcdCc7CiAgICAgIGZvciAoaW50IGkgOiByb3dfc3VtKQogICAJICAgICBzdGQ6OmNvdXQgPDwgaSA8PCAnICc7CiAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgIH0KfQ==