#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include using namespace std; using lint = long long int; using P = pair; using PL = pair; #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i=i##_begin_;i--) #define REP(i, n) FOR(i,0,n) #define IREP(i, n) IFOR(i,0,n) #define ALL(a) (a).begin(),(a).end() constexpr int MOD = 1000000007; constexpr lint B1 = 1532834020; constexpr lint M1 = 2147482409; constexpr lint B2 = 1388622299; constexpr lint M2 = 2147478017; constexpr int INF = 2147483647; void yes(bool expr) {cout << (expr ? "Yes" : "No") << "\n";} templatevoid chmax(T &a, const T &b) { if (avoid chmin(T &a, const T &b) { if (b T; vector U; lint N, K; lint MAXM = 10; bool DEBUG = false; lint calc_score(vector &B, vector &M) { double score1 = 0; REP(i, K) { vector X(N); REP(j, N) { lint t = B[j] * 2 + M[j] * 2; t = T[i] - t; t %= M[j] * 4; if(t < M[j]) { X[j] = t; } else if(t < M[j] * 3) { X[j] = M[j] * 2 - t; } else { X[j] = t - M[j] * 4; } } REP(j, N) FOR(k, j+1, N) score1 += (double)abs(X[j] - X[k]) / (B[j] + B[k]); } double score2 = 0; REP(i, K) { vector X(N); REP(j, N) { lint t = B[j] * 2 + M[j] * 2; t = U[i] - t; t %= M[j] * 4; if(t < M[j]) { X[j] = t; } else if(t < M[j] * 3) { X[j] = M[j] * 2 - t; } else { X[j] = t - M[j] * 4; } } lint ma = 0; REP(j, N) FOR(k, j+1, N) chmax(ma, abs(X[j] - X[k])); score2 += 1.0 / sqrt(1.0 + (double)ma / 20.0); } score1 *= 20000000 / N / (N-1) / K; score2 *= 10000000 / K; return round(score1) * round(score2); }; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); if(DEBUG) { N = 50; K = 50; } else cin >> N >> K; T = vector(K); U = vector(K); if(DEBUG) { vector F(2*K); REP(i, 2*K) F[i] = (double)(rand()) / RAND_MAX; } else { REP(i, K) cin >> T[i]; REP(i, K) cin >> U[i]; } vector B(N), M(N, 1); REP(i, N) B[i] = 1; lint best_score = calc_score(B, M); cerr << best_score << endl; double time = 0; int loop = 0; double start_temp = 11, end_temp = 9; double temp = start_temp; auto start_time = std::chrono::system_clock::now(); while(true) { if(loop%200 == 0) { auto now_time = std::chrono::system_clock::now(); time = std::chrono::duration_cast(now_time-start_time).count(); temp = start_temp + (end_temp - start_temp) * time / (TIME_LIMIT); cerr << "LOOP:" << loop << " SCORE:" << best_score << " TIME:" << time << endl; if(time > TIME_LIMIT) break; } loop++; int i, b, m; while(true) { i = rand() % N; m = rand() % MAXM + 1; b = m; if(m == 1) b = m + rand() % (2*m); if(M[i] != m || B[i] != b) break; } vector lastM(M), lastB(B); if(rand() % 2 < 1) { REP(j, N) if(i != j && M[i] == M[j] && B[i] == B[j]) { M[j] = m; B[j] = b; } } M[i] = m; B[i] = b; lint score = calc_score(B, M); double prob = exp(((double)score-best_score)/pow(10, temp)); if(score > best_score || prob > (rand()%INF)/(double)INF) { //ok best_score = score; } else { //ng M = lastM; B = lastB; } } REP(i, N) cout << B[i] << " " << M[i] << " " << 1000000 << "\n"; }