Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

E: 28

問題文

トランプゲームの大富豪において，ランクが $2$, $8$ のカードは強力です．
そこで，$10$ 進数表記で数字の $2$, $8$ のみからなる整数を良い整数と呼ぶことにします．
良い整数を小さいものから列挙すると $2, 8, 22, 28, 82, 88, \cdots$ となります．

$n$ を正の整数とします．$n$ が良い整数の積の形で表現できるとき，
最大でいくつの積になるか求めてください．できないなら $-1$ と出力してください．

入力

$n$

制約

$1 \leq n \leq 10^{18}$

出力

答えを $1$ 行で出力してください．

サンプル

サンプル入力1

1

サンプル出力1

-1

サンプル入力2

2

サンプル出力2

1

サンプル入力3

88

サンプル出力3

3

$2 \times 2 \times 22$ と表せます．

サンプル入力4

100

サンプル出力4

-1

サンプル入力5

173553147234869248

サンプル出力5

11

$2^6 \times 28 \times 2222^3 \times 8828$ と表せます．

Solution in C# (judge verdict: Accepted)

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

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		long Inf=(long)1e18+1;
		HashSet<long> H=new HashSet<long>();
		H.Add(2);
		H.Add(8);
		L=new List<long>();
		L.Add(2);
		L.Add(8);
		for(int i=2;i<18;i++){
			HashSet<long> nxt=new HashSet<long>();
			foreach(var l in H){
				if(Inf/l>=10){
					if(l*10+2<Inf){
						nxt.Add(l*10+2);
						L.Add(l*10+2);
					}
					if(l*10+8<Inf){
						nxt.Add(l*10+8);
						L.Add(l*10+8);
					}
				}
			}
			H=nxt;
		}
		
		memo=new Dictionary<long,int>();
		dfs(N,0);
		
		if(!memo.ContainsKey(1)){
			Console.WriteLine(-1);
		}else{
			Console.WriteLine(memo[1]);
		}
	}
	long N;
	List<long> L;
	Dictionary<long,int> memo;
	
	void dfs(long rem,int depth){
		for(int i=0;i<L.Count;i++){
			if(L[i]>rem)break;
			if(rem%L[i]!=0)continue;
			if(memo.ContainsKey(rem/L[i])==false){
				memo.Add(rem/L[i],depth+1);
				dfs(rem/L[i],depth+1);
			}else if(memo[rem/L[i]]<depth+1){
				memo[rem/L[i]]=depth+1;
				dfs(rem/L[i],depth+1);
			}
		}
	}
	
	
	
	public Sol(){
		N=rl();
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}