#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define double long double
#define print(a) for(auto x : a) cout << x << " "; cout << endl
const int M = 1000000007;
const int INF = 2e9+1;
const int LINF = 2000000000000000001;
inline int power(int a, int b, int mod=M) {
int x = 1;
a %= mod;
while (b) {
if (b & 1) x = (x * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return x;
}
//_ ***************************** START Below *******************************
const int N = 3e6+9;
vector<int> isPrime;
void seive(){
isPrime.resize(N+1, 1);
isPrime[0] = isPrime[1] = false;
for(int i=2; i*i<=N; i++){
if(!isPrime[i]) continue;
for(int j=i*i; j<=N; j+=i){
isPrime[j] = false;
}
}
}
string a;
int consistency(int n){
vector<int> dp(n+1, 0);
dp[0] = 1;
for(int i=1; i<=n; i++){
int j = i-1;
while( j>=max(0LL, i-6) ){
string s = a.substr(j, i-j);
if(s[0] != '0' && isPrime[stoi(s)]){
dp[i] = (dp[i] + dp[j])%M;
}
j--;
}
}
return dp[n];
}
int practice(int n){
return 0;
}
void solve() {
static int _ = (seive(), 0);
int n;
cin >> a;
n = a.size();
cout << consistency(n) << endl;
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50ICAgICAgICAgICAgICBsb25nIGxvbmcgaW50CiNkZWZpbmUgZG91YmxlICAgICAgICAgICBsb25nIGRvdWJsZQojZGVmaW5lIHByaW50KGEpICAgICAgICAgZm9yKGF1dG8geCA6IGEpIGNvdXQgPDwgeCA8PCAiICI7IGNvdXQgPDwgZW5kbAoKCmNvbnN0IGludCBNID0gMTAwMDAwMDAwNzsKCmNvbnN0IGludCBJTkYgPSAyZTkrMTsKY29uc3QgaW50IExJTkYgPSAyMDAwMDAwMDAwMDAwMDAwMDAxOwoKaW5saW5lIGludCBwb3dlcihpbnQgYSwgaW50IGIsIGludCBtb2Q9TSkgewogICAgaW50IHggPSAxOwogICAgYSAlPSBtb2Q7CiAgICB3aGlsZSAoYikgewogICAgICAgIGlmIChiICYgMSkgeCA9ICh4ICogYSkgJSBtb2Q7IAogICAgICAgIGEgPSAoYSAqIGEpICUgbW9kOwogICAgICAgIGIgPj49IDE7CiAgICB9CiAgICByZXR1cm4geDsKfQoKCi8vXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBCZWxvdyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpjb25zdCBpbnQgTiA9IDNlNis5OwoKdmVjdG9yPGludD4gaXNQcmltZTsKCnZvaWQgc2VpdmUoKXsKCWlzUHJpbWUucmVzaXplKE4rMSwgMSk7Cglpc1ByaW1lWzBdID0gaXNQcmltZVsxXSA9IGZhbHNlOwoJCglmb3IoaW50IGk9MjsgaSppPD1OOyBpKyspewoJCWlmKCFpc1ByaW1lW2ldKSBjb250aW51ZTsKCQkKCQlmb3IoaW50IGo9aSppOyBqPD1OOyBqKz1pKXsKCQkJaXNQcmltZVtqXSA9IGZhbHNlOwoJCX0KCX0KfQoKCgpzdHJpbmcgYTsKCmludCBjb25zaXN0ZW5jeShpbnQgbil7CgkKCXZlY3RvcjxpbnQ+IGRwKG4rMSwgMCk7CglkcFswXSA9IDE7CgkKCWZvcihpbnQgaT0xOyBpPD1uOyBpKyspewoJCQoJCWludCBqID0gaS0xOwoJCXdoaWxlKCAgaj49bWF4KDBMTCwgaS02KSApewoJCQlzdHJpbmcgcyA9IGEuc3Vic3RyKGosIGktaik7CgkJCQoJCQlpZihzWzBdICE9ICcwJyAmJiAgaXNQcmltZVtzdG9pKHMpXSl7CgkJCQlkcFtpXSA9IChkcFtpXSArIGRwW2pdKSVNOwoJCQl9CgkJCWotLTsKCQl9Cgl9CgkKCXJldHVybiBkcFtuXTsKfQoKCgoKCgoKCgoKCgoKCgppbnQgcHJhY3RpY2UoaW50IG4pewoKCiAgICByZXR1cm4gMDsKfQoKCgoKCnZvaWQgc29sdmUoKSB7CgkKCXN0YXRpYyBpbnQgXyA9IChzZWl2ZSgpLCAwKTsKICAgIAogICAgaW50IG47CgljaW4gPj4gYTsKCW4gPSBhLnNpemUoKTsKICAgIAogICAgY291dCA8PCBjb25zaXN0ZW5jeShuKSA8PCBlbmRsOwoKCn0KCgoKCgppbnQzMl90IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCiAgICBpbnQgdCA9IDE7CiAgICAvLyBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBzb2x2ZSgpOwogICAgfQoKICAgIHJldHVybiAwOwp9