This repository has been archived on 2026-07-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
cmc/3sem/cnts/contest7/01-test.c
T
2025-04-13 21:48:15 +03:00

99 lines
2.9 KiB
C
Executable File

#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum
{
MAX_SYM_THREE_LEN = 64,
SYS_BASE = 3,
};
const char ERROR_OUTPUT[] = "18446744073709551616";
int
main(void)
{
int cur_num = getchar();
while (cur_num != EOF && isspace(cur_num)) {
cur_num = getchar();
}
long long res = 0;
bool overflow = false;
bool printed = false;
bool read = false;
while (cur_num != EOF) {
char cur_ch = cur_num;
if (isspace(cur_num)) {
if (!printed) {
if (overflow) {
printf("%s\n", ERROR_OUTPUT);
} else {
printf("%lld\n", res);
}
res = 0;
overflow = false;
printed = true;
}
} else {
read = true;
printed = false;
if (cur_ch == '1') {
long long temp = 0;
if (res < 0) {
if (__builtin_mul_overflow(res + 1, 3, &temp)) {
overflow = true;
}
if (__builtin_add_overflow(temp, 1, &res)) {
overflow = true;
}
if (__builtin_sub_overflow(res, 3, &temp)) {
overflow = true;
}
res = temp;
} else {
if (__builtin_mul_overflow(res, 3, &temp)) {
overflow = true;
}
if (__builtin_add_overflow(temp, 1, &res)) {
overflow = true;
}
}
} else if (cur_ch == 'a') {
long long temp = 0;
if (res > 0) {
if (__builtin_mul_overflow(res - 1, 3, &temp)) {
overflow = true;
}
if (__builtin_sub_overflow(temp, 1, &res)) {
overflow = true;
}
if (__builtin_add_overflow(res, 3, &temp)) {
overflow = true;
}
res = temp;
} else {
if (__builtin_mul_overflow(res, 3, &temp)) {
overflow = true;
}
if (__builtin_sub_overflow(temp, 1, &res)) {
overflow = true;
}
}
} else if (cur_ch == '0') {
long long temp = 0;
if (__builtin_mul_overflow(res, 3, &temp)) {
overflow = true;
}
res = temp;
}
}
cur_num = getchar();
}
if (cur_num == EOF && !printed && !overflow && read) {
printf("%lld\n", res);
}
}