#include <bits/stdc++.h>
using namespace std;
#include <boost/multiprecision/cpp_int.hpp>
using boost::multiprecision::cpp_int;
#define ll long long
using u64 = uint64_t;
using u128 = unsigned __int128;
u128 limit = u128(1) << 64;
static constexpr u64 bases[] =
{2ULL, 325ULL, 9375ULL, 28178ULL,450775ULL,9780504ULL, 1795265022ULL};
static constexpr u64 small_primes[] =
{2ULL,3ULL,5ULL,7ULL,11ULL,13ULL,17ULL,19ULL,23ULL,29ULL,31ULL,37ULL};
u128 modpow(u128 base, u128 expo, u128& mod){
u128 res = 1;
base %= mod;
while(expo){
if(expo&1) res = (u128) (cpp_int(res)*base %mod);
base = (u128) (cpp_int(base)*base %mod);
expo >>= 1;
}
return res;
}
bool isComposite(u128 a, u128 d, int s, u128& n){
u128 x = modpow(a, d, n);
if(x==1 || x==n-1) return false;
for(int r=1; r<s; r++){
x = (u128) (cpp_int(x)*x %n);
if(x==n-1) return false;
}
return true;
}
bool isPrime(u128 n){
if(n<2) return false;
for(u64 p : small_primes){
if(n==p) return true;
if(n%p==0) return false;
}
u128 d = n-1;
int s = __builtin_ctzll(d);
d >>= s;
for(u64 a : bases){
if(a%n==0) continue;
if(isComposite(a, d, s, n)) return false;
}
if(n>limit){
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<u64> dist(2, LLONG_MAX);
for(int i=0; i<5; i++){
u64 z = dist(gen);
if(isComposite(z, d, s, n)) return false;
}
}
return true;
}
unordered_map<string,ll>mp;
ll fn(string s){
if(s.size()==0) return 1;
if(mp[s]!=0){
if(mp[s]==-1) return 0;
return mp[s];
}
ll count = 0;
u128 num = 0;
for(int i=0; i<s.size(); i++){
num = num*10 + s[i]-'0';
if(isPrime(num)) count += fn(s.substr(i+1));
}
if(count==0) { mp[s]=-1; return 0; }
return mp[s]=count;
}
int main() {
int t; cin >> t;
for(int i=0; i<t; i++){
string s; cin >> s;
cout<<fn(s)<<endl;
mp.clear();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNpbmNsdWRlIDxib29zdC9tdWx0aXByZWNpc2lvbi9jcHBfaW50LmhwcD4KdXNpbmcgYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpjcHBfaW50OwojZGVmaW5lIGxsIGxvbmcgbG9uZwoKdXNpbmcgdTY0ICA9IHVpbnQ2NF90Owp1c2luZyB1MTI4ID0gdW5zaWduZWQgX19pbnQxMjg7Cgp1MTI4IGxpbWl0ID0gdTEyOCgxKSA8PCA2NDsKCnN0YXRpYyBjb25zdGV4cHIgdTY0IGJhc2VzW10gPSAKezJVTEwsIDMyNVVMTCwgOTM3NVVMTCwgMjgxNzhVTEwsNDUwNzc1VUxMLDk3ODA1MDRVTEwsIDE3OTUyNjUwMjJVTEx9OwoKc3RhdGljIGNvbnN0ZXhwciB1NjQgc21hbGxfcHJpbWVzW10gPSAKezJVTEwsM1VMTCw1VUxMLDdVTEwsMTFVTEwsMTNVTEwsMTdVTEwsMTlVTEwsMjNVTEwsMjlVTEwsMzFVTEwsMzdVTEx9OwoKdTEyOCBtb2Rwb3codTEyOCBiYXNlLCB1MTI4IGV4cG8sIHUxMjgmIG1vZCl7CiAgdTEyOCByZXMgPSAxOwogIGJhc2UgJT0gbW9kOwogIHdoaWxlKGV4cG8pewogICAgaWYoZXhwbyYxKSByZXMgPSAodTEyOCkgKGNwcF9pbnQocmVzKSpiYXNlICVtb2QpOwogICAgYmFzZSA9ICh1MTI4KSAoY3BwX2ludChiYXNlKSpiYXNlICVtb2QpOwogICAgZXhwbyA+Pj0gMTsKICAgIH0KcmV0dXJuIHJlczsKfQoKYm9vbCBpc0NvbXBvc2l0ZSh1MTI4IGEsIHUxMjggZCwgaW50IHMsIHUxMjgmIG4pewogICAgCiAgdTEyOCB4ID0gbW9kcG93KGEsIGQsIG4pOwogIGlmKHg9PTEgfHwgeD09bi0xKSByZXR1cm4gZmFsc2U7CgogIGZvcihpbnQgcj0xOyByPHM7IHIrKyl7CiAgICB4ID0gKHUxMjgpIChjcHBfaW50KHgpKnggJW4pOwogICAgaWYoeD09bi0xKSByZXR1cm4gZmFsc2U7CiAgICB9CnJldHVybiB0cnVlOwp9Cgpib29sIGlzUHJpbWUodTEyOCBuKXsKICAgIAogIGlmKG48MikgcmV0dXJuIGZhbHNlOwoKICBmb3IodTY0IHAgOiBzbWFsbF9wcmltZXMpewogICAgaWYobj09cCkgcmV0dXJuIHRydWU7CiAgICBpZihuJXA9PTApIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogICAgdTEyOCBkID0gbi0xOwogICAgaW50IHMgPSBfX2J1aWx0aW5fY3R6bGwoZCk7CiAgICBkID4+PSBzOwoKICBmb3IodTY0IGEgOiBiYXNlcyl7CiAgICBpZihhJW49PTApIGNvbnRpbnVlOwogICAgaWYoaXNDb21wb3NpdGUoYSwgZCwgcywgbikpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogIGlmKG4+bGltaXQpewogIAkKICAJcmFuZG9tX2RldmljZSByZDsKICAgIG10MTk5MzcgZ2VuKHJkKCkpOwogICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPHU2ND4gZGlzdCgyLCBMTE9OR19NQVgpOwogICAgCiAgICBmb3IoaW50IGk9MDsgaTw1OyBpKyspewogICAgdTY0IHogPSBkaXN0KGdlbik7CiAgICBpZihpc0NvbXBvc2l0ZSh6LCBkLCBzLCBuKSkgcmV0dXJuIGZhbHNlOwogICAgfQogIAkKICB9ICAKcmV0dXJuIHRydWU7Cn0KCnVub3JkZXJlZF9tYXA8c3RyaW5nLGxsPm1wOwoKbGwgZm4oc3RyaW5nIHMpewoJCmlmKHMuc2l6ZSgpPT0wKSByZXR1cm4gMTsKCmlmKG1wW3NdIT0wKXsKICBpZihtcFtzXT09LTEpIHJldHVybiAwOwogIHJldHVybiBtcFtzXTsKfQoKbGwgY291bnQgPSAwOwkKdTEyOCBudW0gPSAwOwoJCmZvcihpbnQgaT0wOyBpPHMuc2l6ZSgpOyBpKyspewoJCm51bSA9IG51bSoxMCArIHNbaV0tJzAnOwkKaWYoaXNQcmltZShudW0pKSBjb3VudCArPSBmbihzLnN1YnN0cihpKzEpKTsJCgkKfQkKCmlmKGNvdW50PT0wKSB7IG1wW3NdPS0xOyByZXR1cm4gMDsgfQkKcmV0dXJuIG1wW3NdPWNvdW50OwkKfQoKCgoKaW50IG1haW4oKSB7CgppbnQgdDsgY2luID4+IHQ7Cgpmb3IoaW50IGk9MDsgaTx0OyBpKyspewogIHN0cmluZyBzOyBjaW4gPj4gczsKICBjb3V0PDxmbihzKTw8ZW5kbDsKICBtcC5jbGVhcigpOwp9CgpyZXR1cm4gMDsKfQ==