이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/* upsolve with help from PurpleCrayon */
#include <stdio.h>
#define A 36
#define U (1 << A / 2)
int gcd[A + 1][A + 1], mx[U], bb[A / 2], ban_odd[U], kk_even[A / 2 + 1][U]; char good_odd[U], good_even[U];
void init() {
int a, b, c, i, j, k, u, u_, v, v_;
for (a = 0; a <= A; a++)
for (b = 0; b <= A; b++)
gcd[a][b] = a > b ? gcd[b][a] : a == 0 ? b : gcd[b % a][a];
for (u = 1, i = 0; u < U; u++) {
while (1 << i + 1 <= u)
i++;
mx[u] = i;
}
good_odd[0] = 1, ban_odd[0] = 0;
for (j = 0; j < A / 2; j++) {
b = j * 2 + 1;
good_odd[1 << j] = 1;
for (u = 1; u < 1 << j; u++) {
u_ = u | 1 << j, i = mx[u], a = i * 2 + 1;
good_odd[u_] = good_odd[u_ ^ 1 << i] && (u & 1 << (gcd[a][b] - 1) / 2) != 0;
}
for (i = 0; i < A / 2; i++) {
a = i * 2 + 1;
bb[i] = 0;
for (k = 0; k < A / 2; k++) {
c = k * 2 + 2;
if (gcd[b][c] == a)
bb[i] |= 1 << k;
}
}
for (u = (1 << j) - 2; u >= 0; u--) {
u_ = u | 1 << j, i = mx[(1 << j) - 1 ^ u];
ban_odd[u_] = ban_odd[u_ ^ 1 << i] | bb[i];
}
for (u = 0; u < 1 << j; u++) {
u_ = u | 1 << j;
good_odd[u_] &= good_odd[u], ban_odd[u_] |= ban_odd[u];
}
}
good_even[0] = 1;
for (j = 0; j < A / 2; j++) {
b = j * 2 + 2;
good_even[1 << j] = 1;
for (v = 1; v < 1 << j; v++) {
v_ = v | 1 << j, i = mx[v], a = i * 2 + 2;
good_even[v_] = good_even[v_ ^ 1 << i] && (v & 1 << (gcd[a][b] - 1) / 2) != 0;
}
for (v = 0; v < 1 << j; v++) {
v_ = v | 1 << j;
good_even[v_] &= good_even[v];
}
}
for (v = 0; v < 1 << A / 2; v++)
kk_even[0][v] = good_even[v];
for (j = 0; j < A / 2; j++)
for (v = 0; v < 1 << A / 2; v++) {
kk_even[j + 1][v] = kk_even[j][v];
if ((v & 1 << j) != 0)
kk_even[j + 1][v] += kk_even[j][v ^ 1 << j];
}
}
int main() {
int t;
init();
scanf("%d", &t);
while (t--) {
int k, i, u, u_, u0, u1, v_, v0, v1, l, k00, k01, k10, k11;
scanf("%d", &k);
u_ = 0, v_ = 0, l = 0;
for (i = A / 2 - 1; i >= 0; i--) {
u0 = u_, u1 = u_ | 1 << i, v0 = v_, v1 = v_ | 1 << i;
k00 = k01 = k10 = k11 = 0;
for (u = 0; u < 1 << i; u++) {
if (good_odd[u0 | u] && (ban_odd[u0 | u] & v0) == 0)
k00 += kk_even[i][v0 | (1 << i) - 1 & ~ban_odd[u0 | u]];
if (good_odd[u1 | u] && (ban_odd[u1 | u] & v0) == 0)
k01 += kk_even[i][v0 | (1 << i) - 1 & ~ban_odd[u1 | u]];
if (good_odd[u0 | u] && (ban_odd[u0 | u] & v1) == 0)
k10 += kk_even[i][v1 | (1 << i) - 1 & ~ban_odd[u0 | u]];
if (good_odd[u1 | u] && (ban_odd[u1 | u] & v1) == 0)
k11 += kk_even[i][v1 | (1 << i) - 1 & ~ban_odd[u1 | u]];
}
if (k < k00) {
u_ = u0, v_ = v0, l += 0;
continue;
}
k -= k00;
if (k < k01) {
u_ = u1, v_ = v0, l += 1;
continue;
}
k -= k01;
if (k < k10) {
u_ = u0, v_ = v1, l += 1;
continue;
}
k -= k10;
u_ = u1, v_ = v1, l += 2;
}
printf("%d", l);
for (i = 0; i < A / 2; i++) {
if ((u_ & 1 << i) != 0)
printf(" %d", i * 2 + 1);
if ((v_ & 1 << i) != 0)
printf(" %d", i * 2 + 2);
}
printf("\n");
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
Main.c: In function 'init':
Main.c:16:17: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
16 | while (1 << i + 1 <= u)
| ~~^~~
Main.c:38:37: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
38 | u_ = u | 1 << j, i = mx[(1 << j) - 1 ^ u];
| ~~~~~~~~~^~~
Main.c: In function 'main':
Main.c:84:38: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
84 | k00 += kk_even[i][v0 | (1 << i) - 1 & ~ban_odd[u0 | u]];
| ~~~~~~~~~^~~
Main.c:84:42: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]
84 | k00 += kk_even[i][v0 | (1 << i) - 1 & ~ban_odd[u0 | u]];
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
Main.c:86:38: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
86 | k01 += kk_even[i][v0 | (1 << i) - 1 & ~ban_odd[u1 | u]];
| ~~~~~~~~~^~~
Main.c:86:42: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]
86 | k01 += kk_even[i][v0 | (1 << i) - 1 & ~ban_odd[u1 | u]];
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
Main.c:88:38: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
88 | k10 += kk_even[i][v1 | (1 << i) - 1 & ~ban_odd[u0 | u]];
| ~~~~~~~~~^~~
Main.c:88:42: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]
88 | k10 += kk_even[i][v1 | (1 << i) - 1 & ~ban_odd[u0 | u]];
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
Main.c:90:38: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
90 | k11 += kk_even[i][v1 | (1 << i) - 1 & ~ban_odd[u1 | u]];
| ~~~~~~~~~^~~
Main.c:90:42: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]
90 | k11 += kk_even[i][v1 | (1 << i) - 1 & ~ban_odd[u1 | u]];
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
Main.c:73:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
73 | scanf("%d", &t);
| ^~~~~~~~~~~~~~~
Main.c:77:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
77 | scanf("%d", &k);
| ^~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |