传送门
#include<bits/stdc++.h>
using namespace std;
bool isprime[10038];
int t, pt[10000], m[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, key = 1;
string s;
void prime_table(){//1~10035间的质数
for(int i = 2; i <= 10035; i++)isprime[i] = 1;
for(int i = 2; i <= 101; i++){
if(isprime[i]){
for(int j = i * 2; j <= 10035; j += i){
isprime[j] = 0;
}
}
}
for(int i = 2; i <= 10035; i++)
if(isprime[i]){
pt[key++] = i;
}
}
bool isprimee(int p){
for(int i = 1; i <= sqrt(p); i++){
if(p % pt[i]) return false;
}
return true;
}
bool isok(int dat){
if((dat / 100) % 100 > 12) return false;
if(dat % 100 > m[(dat / 100) % 100]) return false;
if(!(((dat / 10000) % 400 == 0 || ((dat / 10000) % 100 != 0 && (dat / 10000) % 4 == 0 ))))
if((dat / 100) % 100 == 2 && dat % 100 >= 29) return false;
return true;
}
int l[9], tmp[9], pos[9];
int dfs(string a){
int ans = 0;
memset(l, 0, sizeof(l));
for(int i = 1; i <= 8; i++) tmp[i] = 0;
int cnt = 0, k = 1;
for(int i = 0; i < 8; i++){
if(a[i] == '-'){
l[i + 1] = -1;
++cnt;
pos[k++] = i + 1;
}
else{
l[i + 1] = a[i] - '0';
}
}
if(cnt == 0){
int dat = l[1] * 10000000 + l[2] * 1000000 + l[3] * 100000 + l[4] * 10000 + l[5] * 1000 + l[6] * 100 + l[7] * 10 + l[8] * 1;
return (isok(dat) && isprimee(dat));
}
while(1){
if(tmp[1] >= 10)
break;
for(int i = cnt; i > 1; i--){
if(tmp[i] >= 10){
tmp[i] -= 10;
tmp[i - 1] ++;
}
else break;
}
for(int i = 1; i <= cnt; i++){
l[pos[i]] = tmp[i];
}
int dat = l[1] * 10000000 + l[2] * 1000000 + l[3] * 100000 + l[4] * 10000 + l[5] * 1000 + l[6] * 100 + l[7] * 10 + l[8] * 1;
if(isok(dat))
if(isprimee(dat))
ans++;
tmp[cnt]++;
}
return ans;
}
int main(){
prime_table();
cin >> t;
for(int i = 1; i <= t; i++){
cin >> s;
cout << dfs(s) << endl;
}
return 0;
}