Problem:
Score : 300 points

Problem Statement

To make it difficult to withdraw money, a certain bank allows its customers to withdraw only one of the following amounts in one operation:

1 yen (the currency of Japan)

6 yen, 6^2(=36) yen, 6^3(=216) yen, ...

9 yen, 9^2(=81) yen, 9^3(=729) yen, ...

At least how many operations are required to withdraw exactly N yen in total?

It is not allowed to re-deposit the money you withdrew.

Constraints

1 \leq N \leq 100000

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

If at least x operations are required to withdraw exactly N yen in total, print x.

Sample Input 1

127

Sample Output 1

4

By withdrawing 1 yen, 9 yen, 36(=6^2) yen and 81(=9^2) yen, we can withdraw 127 yen in four operations.

Sample Input 2

3

Sample Output 2

3

By withdrawing 1 yen three times, we can withdraw 3 yen in three operations.

Sample Input 3

44852

Sample Output 3

16

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class MainClass
{
	public const long Giri = 1000000007;
	
	public static void Main(string[] args)
	{
		int n = Console.ReadLine().ToInt();
		int max6 = (int)Math.Log(n, 6)+1;
		int max9 = (int)Math.Log(n, 9)+1;
		
		int[] dp = new int[n+2];
		for(int i = 0; i < n+1; i++)
			dp[i]=999999999;
		dp[0] = 0;
		//dp[i] = i会の操作で最小の回数
		for(int i = 0; i <= n;i++)
		{
			dp[i+1] = Math.Min(dp[i] + 1, dp[i+1]);
			for(int j = 1; j < max6; j++)
			{
				int k = (int)Math.Pow(6,j);
				if(i+k>=n+1) break;
				dp[i+k] = Math.Min(dp[i] + 1, dp[i+k]);
			}
			for(int j = 1; j < max9; j++)
			{
				int k = (int)Math.Pow(9,j);
				if(i+k>=n+1) break;
				dp[i+k] = Math.Min(dp[i] + 1, dp[i+k]);
			}
		}
		Console.WriteLine(dp[n]);
	}
	
	static long GCD(long a, long b)
	{
		var v = new[] { a, b };
		while (v[1] != 0) { v = new[] { v[1], v[0] % v[1] }; }
		return v[0];
	}
	public static string[] Input() { return Console.ReadLine().Split(' '); }
	public static int Clamp(int val, int max, int min = 0) { return Math.Min(max, Math.Max(min, val)); }
}

public static class Smarter
{
	public static int ToInt(this string str) { return int.Parse(str); }
	public static long ToLong(this string str) { return long.Parse(str); }
	public static int[] ToInt(this string[] str)
	{
		int[] r = new int[str.Length];
		for(int i = 0; i < str.Length; i++) r[i] = str[i].ToInt();
		return r;
	 }
	
}