#include <bits/stdc++.h> using namespace std; using ll = long long; #define dbl long double #define vec vector #define um unordered_map #define us unordered_set using ull = unsigned long long; using vi = vec<int>; using vl = vector<ll>; using vd = vector<double>; using pii = pair<int,int>; using pll = pair<ll, ll>; using pdd = pair<dbl, dbl>; vi primes = {2}; void init() { int n = sqrt(1.01e9+1); vector<bool> locprimes(n, true); locprimes[0] = false; locprimes[1] = false; for (int i = 2; i <= n; i++ ) { if (locprimes[i] == false) continue; for (int j = 2 * i; j <= n; j += i) { locprimes[j] = false; } } for (int i = 3; i <= n; i++) { if (locprimes[i]) { primes.push_back(i); } } } bool is_prime(int n) { if (n == 1 || n == 0) return false; for (const auto p : primes) { if (p * p > n) { return true; } if (n % p == 0) { return false; } } return true; } int rec(string num) { int n = 0, power = 1; for (int i = int(num.size() - 1); i >= 0; i--) { n += (num[i] - '0') * power; power *= 10; } if (!is_prime(n)) return 0; num.clear(); int tmp = n; while (tmp > 0) { num.push_back((tmp % 10) + '0'); tmp /= 10; } reverse(num.begin(), num.end()); int maxx = 1; for (int i = 0; i < num.size(); i++) { string tmp; for (int j = 0; j < num.size(); j++) { if (j != i) { tmp.push_back(num[j]); } } if (tmp.size() != 0) maxx = max(maxx, rec(tmp) + 1); } return maxx; } int main(){ init(); int n, tmp; cin >> n; tmp = n; string num; while (tmp > 0) { num.push_back((tmp % 10) + '0'); tmp /= 10; } reverse(num.begin(), num.end()); cout << rec(num) << endl; return EXIT_SUCCESS; }