본문 바로가기
Computer Science

정식이의 은행업무

by OKOK 2019. 2. 18.

1. 오케이?

2. 2진수, 3진수를 받음

3. 배타적 OR 를 처리함

4. 3진수 값을 하나씩 바꿔가면서

5. 2의 제곱승으로 나타낼 수 있는지 확인함

6. 비트 연산 필요함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<stdio.h>
#define MAX 5
 
int TC, IMPOS;
char mod2[MAX], mod3[MAX];
typedef unsigned long long llu;
llu ANS, val2, val3;;
 
void init() {
    IMPOS = 1;
    val2 = val3 = 0;
}
void scan() {
    scanf("%s"&mod2);
    scanf("%s"&mod3);
    init();
}
void print() {
    if (IMPOS)  printf("-1\n");
    else        printf("%llu\n", ANS);
}
 
void solve() {
    int len2 = 0, len3 = 0;
    while (mod2[len2] != '\0')  
        val2 = val2 * 2 + (mod2[len2++- '0');
    while (mod3[len3] != '\0'
        val3 = val3 * 3 + (mod3[len3++- '0');
 
    int idx = len3 - 1;
    llu val3Buf, diff, power = 1;
    while (idx >= 0) {
        for (int i = 0; i < 3; i++) {
            if (i == mod3[idx] - '0')   continue;
            if (i < mod3[idx])   
                val3Buf = val3 - (mod3[idx] - '0' - i) * power;
            else
                val3Buf = val3 + (i - (mod3[idx] - '0')) * power;
            diff = val3Buf ^ val2;
            if (!(diff & (diff - 1)) && !(diff >> len2))  IMPOS--, ANS = val3Buf;
        }
        power *= 3, idx--;
    }
}
 
int main() {
    freopen("input.txt""r", stdin);
    scanf("%d"&TC);
    while (TC--) {
        scan();
        solve();
        print();
    }
    return 0;
}
 
cs

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
 
#define MAX 5
 
typedef unsigned long long ull;
 
char binary[MAX];
int binary_len;
char ternary[MAX];
int ternary_len;
 
ull convert_n_nary_to_ull(ull n, char *nary, int len) {
    ull ret = 0;
    ull now = 1;
    for (int i = 0; i < len; ++i) {
        ret += now * (nary[len - 1 - i] - '0');
        now *= n;
    }
 
    return ret;
}
 
int main(int argc, char **argv)
{
    freopen("input.txt""r", stdin);
    setbuf(stdout, NULL);
 
    int cases = 0;
    scanf("%d"&cases);
    for (int i = 0; i < cases; ++i) {
        scanf("%s", binary);
        for (binary_len = 0; binary[binary_len] != '\0'++binary_len);
        scanf("%s", ternary);
        for (ternary_len = 0; ternary[ternary_len] != '\0'++ternary_len);
 
        int is_end = 0;
        ull result = 0ULL;
        ull b = convert_n_nary_to_ull(2ULL, binary, binary_len);
        ull b_max = 1;
        for (int j = 0; j < binary_len - 2++j)
            b_max *= 2ULL;
 
        for (int j = 0; j < ternary_len; ++j) {
            char origin = ternary[j];
            for (int k = 0; k < 3++k) {
                if (k == origin - '0')
                    continue;
                ternary[j] = k + '0';
                ull t = convert_n_nary_to_ull(3ULL, ternary, ternary_len);
                ull diff = b ^ t;
                if (diff <= b_max) {
                    while (1) {
                        if (diff == 1ULL)
                            break;
                        else if (diff % 2ULL != 0ULL)
                            break;
                        diff /= 2ULL;
                    }
 
                    if (diff == 1ULL) {
                        if (result == 0ULL) {
                            result = t;
                        }
                        else {
                            result = 0ULL;
                            is_end = 1;
                            break;
                        }
                    }
                }
            }
            ternary[j] = origin;
 
            if (is_end)
                break;
        }
 
        if (result == 0ULL)
            printf("-1\n");
        else
            printf("%llu\n", result);
    }
 
    return 0;
}
 
cs

 


'Computer Science' 카테고리의 다른 글

제곱수의 합 계산하기  (0) 2019.02.18
빠른 휴대전화 키패드  (0) 2019.02.18
pacman basic  (0) 2019.02.18
모음이 보이지 않는 사람  (0) 2019.02.13
세상의 모든 팰린드롬  (0) 2019.02.13

댓글