#include #include #include #define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,s,n) for(int i = (s); (n) > i; i++) #define REP(i,n) rep(i,0,n) #define RANGE(x,a,b) ((a) <= (x) && (x) <= (b)) #define DUPLE(a,b,c,d) (RANGE(a,c,d) || RANGE(b,c,d) || RANGE(c,a,b) || RANGE(d,a,b)) #define INCLU(a,b,c,d) (RANGE(a,c,d) && (b,c,d)) #define PW(x) ((x)*(x)) #define ALL(x) (x).begin(), (x).end() #define MODU 1000000007 #define bitcheck(a,b) ((a >> b) & 1) #define bitset(a,b) ( a |= (1 << b)) #define bitunset(a,b) (a &= ~(1 << b)) #define MP(a,b) make_pair((a),(b)) #define Manh(a,b) (abs((a).first-(b).first) + abs((a).second - ((b).second)) #define pritnf printf #define scnaf scanf #define itn int using namespace std; typedef long long ll; typedef pair pii; typedef pair pll; ll gcd(ll a, ll b) { if (b == 0) return a; return gcd(b, a%b); } template void Fill(A(&array)[N], const T &val) { std::fill((T*)array, (T*)(array + N), val); } struct Edge { int from, to; }; signed main() { string st; cin >> st; reverse(ALL(st)); vector str(st.length()); REP(i, st.length()) { str[i] = st[i] - '0'; } int mode = 0; bool ok = true,can = false; REP(i,st.length()) { can = false; switch (mode) { case 0: if (st.length() == 1) { if (str[i] == 6 || str[i] == 7) can = true; else ok = false; break; } if (str[i] != 2 && str[i] != 3 && str[i] != 4) { ok = false; } mode++; break; case 1: if (str[i] == 7 || str[i] == 8) { mode++; can = true; break; } if (st.length() -1==i && str[i] == 1) { can = true; break; } if (str[i] != 3 && str[i] != 4 && str[i] != 5) { ok = false; } break; case 2: if (str[i] != 6 && str[i] != 7) { ok = false; } can = true; break; } } if (can && ok) { cout << "Yes" << endl; return 0; } cout << "No" << endl; return 0; }