#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:336777216")
#pragma GCC optimize("Ofast")

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <functional>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
#define int long long int
typedef complex<long double> cd;
const long double pi=acos(-1);
typedef double db;
typedef long double ldb;
typedef pair <int,int> pii;
typedef pair <db,db> pdd;
typedef vector<int> vi;
typedef vector<vector<int> > matrix;

#define m1 make_pair
#define pb push_back
#define flush fflush(stdout)
#define IOS std::ios::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL);
#define reset(x,v) memset(x,v,sizeof(x))

#define fi first
#define se second
#define endl "\n"
#define debug(x) (cerr << #x << ": " << x << "\n")
#define setbits(x) __builtin_popcount(x)
#define setbitsll(x) __builtin_popcountll(x)
#define all(x) x.begin(),x.end()
#define pii pair<int,int>

inline int gcd(int a,int b){if(a==0) return b;return gcd(b%a,a);}
inline int power(ll a,ll n,ll m){if(n==0)return 1;ll p=power(a,n/2,m);p=(p%m*p%m)%m;if(n%2) return (p%m*a%m)%m;else return p;}
const double EPS = 1e-9;
const ll MOD =998244353;
const ll hell=1000000007;
const int INF = 1e18;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
template<typename T>
using ordered_set=tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
std::mt19937 rng(seed);

double startTime;
double getCurrentTime() {
    return ((double)clock() - startTime) / CLOCKS_PER_SEC;
}
const int dx[] = { -1, 0, 1, 0 };
const int dy[] = { 0, 1, 0, -1 };

const int N=200005;



void solve()
{
   
    string s;
    cin>>s;
    int n=s.length();
    int f[10]={0};
    for(int i=0;i<n;i++)
        f[s[i]-'0']++;
    if(n==1)
    {
        if(s[0]=='8')
        {
            cout<<"Yes"<<endl;
            
        }
        else
            cout<<"No"<<endl;
        return;
    }
    if(n==2)
    {
        int vl=s[0]-'0';
        vl=vl*10+s[1]-'0';
        if(!(vl%8))
        {
            cout<<"Yes"<<endl;
            return;
        }
        vl=s[1]-'0';vl=vl*10+s[0]-'0';
        if(!(vl%8))
        {
            cout<<"Yes"<<endl;
            return;
        }
        cout<<"No"<<endl;
        return;
    }
    for(int i=8;i<1000;i+=8)
    {
        int x=i;vi ve;
        while(x>0)
        {
            ve.pb(x%10);
            x=x/10;
        }
        while(ve.size()<3)
            ve.pb(0);
        int pos=1;vi to;
        for(int j=0;j<ve.size();j++)
        {
            if(f[ve[j]])
            {
                f[ve[j]]--;
                to.pb(ve[j]);
            }
            else
            {pos=0;
                break;
            }
        }
        if(pos)
        {
            cout<<"Yes"<<endl;
            return;
        }
        for(int j:to)
            f[j]++;
    }
    cout<<"No"<<endl;
    
    
}

int32_t main()
{
    
    IOS;
    int t;
    t=1;
    //cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s, ans = "No";
    int slen;
    int num[10] = {}, dig[10] = {}, tem;
    bool flg;

    cin >> s;
    slen = s.size();
    for ( int i = 0; i < slen; i++ ) {
        num[s[i] - '0'] ++;
    }

    for ( int i = 0; i < 1000; i+=8 ) {
        tem = i;
        for ( int j = 0; j < min(3, slen); j++ ) {
            dig[tem % 10] ++;
            tem /= 10;
        }

        flg = true;
        for ( int j = 0; j < 10; j++ ) {
            if ( num[j] < dig[j] ) {
                flg = false;
            }
        }

        if ( flg ) {
            ans = "Yes";
        }

        for ( int j = 0; j < 10; j++ ) {
            dig[j] = 0;
        }
    }

    cout << ans << endl;
    return (0);
}
