import sys

sys.setrecursionlimit(10**7)

# 再帰的に求められる

memo = [-1] * 110000



# ベキ乗は英語でpower

def withdrawals(n):

    if n == 0:  # 最後まで下ろせたら完了である

        return 0

    if memo[n] != -1:  # すでに最適解がもとまっているならばその解を返す

        return memo[n]

    res = n  # すべて1円で支払ったと仮定する

    pow6 = 1

    while pow6 <= n:

        res = min(res, withdrawals(n - pow6) + 1)

        pow6 *= 6



    pow9 = 1

    while pow9 <= n:

        res = min(res, withdrawals(n - pow9) + 1)

        pow9 *= 9



    memo[n] = res

    return res





N = int(eval(input()))

withdrawals(N)

print((memo[N]))

bank = [1]

N = int(eval(input()))

for i in range(20):

    if 100000 >= 6**i:

        bank.append(6**i)

    if 100000 >= 9**i:

        bank.append(9**i)

# print(bank)

dp = [[10**10]*(N+1) for _ in range(len(bank)+1)]



dp[0][0] = 0

# i番目の引き出し方法を使う

for i in range(len(bank)):

    for j in range(N+1):

        # 使わない場合

        dp[i+1][j] = min(dp[i+1][j], dp[i][j])

        # 使う場合

        if j + bank[i] > N:  # Nを超えるならcontinue

            continue

        dp[i+1][j+bank[i]] = min(dp[i][j]+1, dp[i+1][j]+1)

print((dp[len(bank)][N]))

import sys

sys.setrecursionlimit(10**7)
# 再帰的に求められる
memo = [-1] * 110000
# ベキ乗は英語でpower
def withdrawals(n):
    if n == 0:  # 最後まで下ろせたら完了である
        return 0
    if memo[n] != -1:  # すでに最適解がもとまっているならばその解を返す
        return memo[n]
    res = n  # すべて1円で支払ったと仮定する
    pow6 = 1
    while pow6 <= n:
        res = min(res, withdrawals(n - pow6) + 1)
        pow6 *= 6
    pow9 = 1
    while pow9 <= n:
        res = min(res, withdrawals(n - pow9) + 1)
        pow9 *= 9
    memo[n] = res
    return res


N = int(eval(input()))
withdrawals(N)
print((memo[N]))

bank = [1]
N = int(eval(input()))
for i in range(20):
    if 100000 >= 6**i:
        bank.append(6**i)
    if 100000 >= 9**i:
        bank.append(9**i)
# print(bank)
dp = [[10**10] * (N + 1) for _ in range(len(bank) + 1)]
dp[0][0] = 0
# i番目の引き出し方法を使う
for i in range(len(bank)):
    for j in range(N + 1):
        # 使わない場合
        dp[i + 1][j] = min(dp[i + 1][j], dp[i][j])
        # 使う場合
        if j + bank[i] > N:  # Nを超えるならcontinue
            continue
        dp[i + 1][j + bank[i]] = min(dp[i][j] + 1, dp[i + 1][j] + 1)
print((dp[len(bank)][N]))

-import sys - -sys.setrecursionlimit(10**7) -# 再帰的に求められる -memo = [-1] * 110000 -# ベキ乗は英語でpower -def withdrawals(n): -    if n == 0:  # 最後まで下ろせたら完了である -        return 0 -    if memo[n] != -1:  # すでに最適解がもとまっているならばその解を返す -        return memo[n] -    res = n  # すべて1円で支払ったと仮定する -    pow6 = 1 -    while pow6 <= n: -        res = min(res, withdrawals(n - pow6) + 1) -        pow6 *= 6 -    pow9 = 1 -    while pow9 <= n: -        res = min(res, withdrawals(n - pow9) + 1) -        pow9 *= 9 -    memo[n] = res -    return res - - +bank = [1] -withdrawals(N) -print((memo[N])) +for i in range(20): +    if 100000 >= 6**i: +        bank.append(6**i) +    if 100000 >= 9**i: +        bank.append(9**i) +# print(bank) +dp = [[10**10] * (N + 1) for _ in range(len(bank) + 1)] +dp[0][0] = 0 +# i番目の引き出し方法を使う +for i in range(len(bank)): +    for j in range(N + 1): +        # 使わない場合 +        dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]) +        # 使う場合 +        if j + bank[i] > N:  # Nを超えるならcontinue +            continue +        dp[i + 1][j + bank[i]] = min(dp[i][j] + 1, dp[i + 1][j] + 1) +print((dp[len(bank)][N]))