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;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef complex<double> P;
typedef pair<int,int> pii;
#define REP(i,n) for(ll i=0;i<n;++i)
#define REPR(i,n) for(ll i=1;i<n;++i)
#define FOR(i,a,b) for(ll i=a;i<b;++i)

#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()

#define MOD (ll)(1e9+7)
#define ADD(a,b) a=((a)+(b))%MOD
#define FIX(a) ((a)%MOD+MOD)%MOD

ll n;

vector<ll> good;
set<ll> tmp[20];

int main(){
  // init good number
  tmp[0].insert(2);
  tmp[0].insert(8);
  set<ll>::iterator iter;
  REP(i,16){
    iter = tmp[i].begin();
    while(iter!=tmp[i].end()){
      ll x = *iter;
      tmp[i+1].insert(x*10ll+2ll);
      tmp[i+1].insert(x*10ll+8ll);
      ++iter;
    }
  }
  REP(i,17){
    iter = tmp[i].end(); --iter;
    tmp[i].erase(iter);
    iter = tmp[i].begin();
    while(iter!=tmp[i].end()){
      good.push_back(*iter);
      ++iter;
    }
  }
  // solve
  cin>>n;
  if(n==1){
    cout<<-1<<endl;
    return 0;
  }
  ll res = 0;
  REP(_i,good.size()){
    int i = good.size()-1-_i;
    ll val = good[i];
    while(n%val==0){
      res++;
      n/=val;
    }
  }
  if(n!=1)res=-1;
  cout<<res<<endl;
  return 0;
}