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: Wrong Answer)

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
vector<ll> v;

void dfs(ll d,ll s,ll u){
  if(d==18)return;
  if(s&&u!=d)v.push_back(s);
  dfs(d+1,s*10+2,u);
  dfs(d+1,s*10+8,u+1);
}

int main(){
  
  dfs(0,0,0);
  sort(v.begin(),v.end());
  ll n;
  cin>>n;
  if(n==1){cout<<-1<<endl;return 0;}
  ll ans=0;


  for(ll i=v.size()-1;i>=0;i--){

    if(n%v[i]==0){
      ll u=0,tp=v[i];
      for(int j=i-1;j>=0;j--){
	while(tp%v[j]==0)u++,tp/=v[j];
      }
      if(tp==1)continue;
    }
    
    while(n%v[i]==0)n/=v[i],ans++;

  }
  if(n==1)cout<<ans<<endl;
  else cout<<-1<<endl;
  return 0;
}