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)

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
int ans=-1;
ll n;
vector <ll> a;

void mk28(ll div){
  if(n<div)return;
  if(div)a.push_back(div);
  mk28(div*10+2);
  mk28(div*10+8);
}


void saiki(ll num,int idx,int sum){
  if(num==1) ans=max(sum,ans);
  if(num<a[idx]||idx==a.size())return;
  if(num%a[idx]==0)saiki(num/a[idx],idx,sum+1);
  saiki(num,idx+1,sum);
}

int main(){
  cin>>n;
  mk28(0);
  sort(a.begin(),a.end());
  if(n>1)saiki(n,0,0);
  cout <<ans<<endl;
  return 0;
}