void topological_sort(int num_nodes) { for (int i = 0; i < num_nodes; ++i) { if (incoming_degree.find(i) == incoming_degree.end()) pq.push(i); } while (!pq.empty()) { int u = pq.top(); pq.pop(); printf("%d ", u); for (int i = 0; i < adj_list[u].size(); ++i) { if (--incoming_degree[adj_list[u][i]] == 0) pq.push(adj_list[u][i]); } adj_list[u].clear(); } }
int main() { #ifdef LOCAL freopen(fn".in", "r", stdin); freopen(fn".out", "w", stdout); #endif scanf("%I64d%I64d%I64d%I64d", &a1, &b1, &a2, &b2); calc(a1, d1); calc(b1, d1); calc(a2, d2); calc(b2, d2); for (auto it = begin(d1); it != end(d1); it++) { if (it -> f != 2 && it -> f != 3) { int k = it -> f; if (d2.find(k) == end(d2) || d2[k] != it -> s) { puts("-1"); return 0; } } } for (auto it = begin(d2); it != end(d2); it++) { if (it -> f != 2 && it -> f != 3) { int k = it -> f; if (d1.find(k) == end(d1) || d1[k] != it -> s) { puts("-1"); return 0; } } } ll delta1 = 0, delta2 = 0; if (d2[3] > d1[3]) { delta1 = d2[3] - d1[3]; d2[3] -= delta1; d2[2] += delta1; ch(a2, b2, delta1); } else { delta1 = d1[3] - d2[3]; d1[3] -= delta1; d1[2] += delta1; ch(a1, b1, delta1); } if (d2[2] > d1[2]) { delta2 = d2[2] - d1[2]; d2[2] -= delta2; change(a2, b2, pow(2, delta2)); } else { delta2 = d1[2] - d2[2]; d1[2] -= delta2; change(a1, b1, pow(2, delta2)); } printf("%I64d\n", delta1 + delta2); printf("%I64d %I64d\n%I64d %I64d", a1, b1, a2, b2); }
int main() { fibPos[1] = 1; for(int i = 2; i < 46; ++i) { fib[i] = fib[i-2] + fib[i-1]; fibPos[ fib[i] ] = i; //printf("%d: %u %u %lld \n", i, fib[i], 1U << 31, (ll) (1U << 31) - (ll) fib[i] ); } int T; scanf("%d", &T); while(T--) { int nPos; scanf("%d", &nPos); int fibNum; int maxPos = 0; for(int i = 0; i < nPos; ++i) { scanf("%d", &fibNum); mii::iterator mit = fibPos.find(fibNum); pos[i] = mit->second; maxPos = max(maxPos, pos[i]); //printf("fibNum %d pos=%d\n", fibNum, pos[i]); } gets(buf); int len = strlen(buf); if (len == 0) { gets(buf); len = strlen(buf); } //printf("%s\n", buf); for(int i = 0; i < maxPos; ++i) { ans[i] = ' '; } ans[maxPos] = '\0'; int ansPos = 0; for(int i = 0; i < len; ++i) { if (buf[i] < 'A' || buf[i] > 'Z') continue; //printf("Ans pos %d pos[] = %d i=%d %c\n", ansPos, pos[ansPos], i, buf[i]); ans[ pos[ansPos] - 1 ] = buf[i]; ++ansPos; if (ansPos >= nPos) break; } printf("%s\n", ans); //printf("[%s] maxPos %d\n", ans, maxPos); } return 0; }