#include <iostream>
#include <iomanip>
#include <map>
#include <set>
#include <cmath>
#include <vector>
#include <climits>
#include <string>
#include <algorithm>
#include <sstream>
using namespace std;
vector<string> split(string haystack, string needle) {
vector<string> result;
int startPos = 0;
int foundPos = haystack.find(needle, startPos);
while (foundPos != string::npos) {
int count = foundPos - startPos;
string token = haystack.substr(startPos, count);
if (!token.empty()) {
result.push_back(token);
}
startPos = foundPos + needle.length();
foundPos = haystack.find(needle, startPos);
}
string token = haystack.substr(startPos, haystack.length() - startPos);
if (!token.empty()) {
result.push_back(token);
}
return result;
}
string nameConvert(const string& name) {
const string DELIMITER = " ";
stringstream builder;
auto parts = split(name, DELIMITER);
for (auto part : parts) {
part[0] = toupper(part[0]);
transform(part.begin() + 1, part.end(), part.begin() + 1, ::tolower);
builder << part << DELIMITER;
}
return builder.str();
}
string dateConvert(const string& date) {
const string DELIMITER = "/";
stringstream builder;
auto parts = split(date, DELIMITER);
builder << setw(2) << setfill('0') << parts[0] << DELIMITER;
builder << setw(2) << setfill('0') << parts[1] << DELIMITER;
builder << parts[2];
return builder.str();
}
bool isPrime(long long n) {
for (int i = 2;i * i <= n;i++) {
if (n % i == 0) {
return false;
}
}
return n >= 2;
}
bool isAllDigitPrime(string n) {
for (int i = 0;i < n.length();i++) {
if (n[i] != '2' && n[i] != '3' && n[i] != '5' && n[i] != '7') {
return false;
}
}
return true;
}
bool isSumDigitPrime(string n) {
long long sum = 0;
for (int i = 0;i < n.length();i++) {
sum = sum + (n[i] - '0');
}
return isPrime(sum);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string n;cin >> n;
if (isAllDigitPrime(n) && isSumDigitPrime(n)) {
cout << "YES";
}
else {
cout << "NO";
}
return 0;
}