#include // #include #include #include #include #include using namespace std; unsigned int n, m, k, bestp = 0, currentp, ch, c; unsigned short a[1000][1000], b, currenta[1000], idx[1000]; bool bestk[1000], currentk[1000]; clock_t start; const clock_t TC = 4.95 * CLOCKS_PER_SEC; int main() { start = clock(); ifstream inp; inp.open("subsetselection.in"); inp >> n >> m >> b; for(unsigned int i = 0; i < n; ++i) { for(unsigned int j = 0; j < m; ++j) { inp >> a[i][j]; } idx[i] = i; } inp.close(); for(unsigned i = 0; i < n; ++i) { for(unsigned int j = 0; j < m; ++j) { currenta[j] += a[i][j]; currenta[j] %= b; } } for(unsigned int j = 0; j < m; ++j) { bestp += currenta[j]*currenta[j]; } // cout << "BESTALL: p=" << bestp << "; "; memset(bestk, 0, n); while(clock() - start <= TC) { memset(currentk, 0, n); memset(currenta, 0, m*(sizeof(unsigned short))); random_shuffle(idx, idx+n); /* cout << "idc: "; for(unsigned i = 0; i < n; ++i) { cout << idx[i]+1 << " "; } cout << ";" << endl; */ for(unsigned j = 0; j < n-1; ++j) { currentk[idx[j]] = true; currentp = 0; for(unsigned int i = 0; i < m; ++i) { currenta[i] += a[idx[j]][i]; currenta[i] %= b; // cout << currenta[i] << " "; currentp += currenta[i]*currenta[i]; } // cout << "p=" << currentp << endl; if(currentp > bestp) { /* cout << "BEST: p=" << currentp << "; "; for(unsigned i = 0; i < n; ++i) { cout << currentk[i] << " "; } cout << endl; */ bestp = currentp; memcpy(bestk, currentk, n); k = j+1; } } } ofstream out; out.open("subsetselection.out"); // out << "k="; out << k << '\n'; for(unsigned i = 0; i < n; ++i) { if(bestk[i]) { // out << "i="; out << i+1 << '\n'; } } out.close(); // cout << clock() - start << endl; return 0; }