#include <iostream>
#include <cstdio>
#include <cstring>
#define N 10000
using namespace std;
int ans;
int year, month, day;
int dateNum;
int day_per_month[13] = {0, 31, 28, 31, 30,
31, 30, 31, 31,
30, 31, 30, 31
};
int date[10];
bool vis[N];
int pr[N];
int num;
void prime_get(void)
{
vis[1] = 1;
for (int i = 2; i <= N; i++)
{
if (vis[i] == 0)
{
pr[++num] = i;
for (int j = i; j <= N; j += i)
vis[j] = 1;
}
}
}
bool legal_date(int y, int m, int d)
{
if (y == 0 || m > 12)
return 0;
if (m == 0 || d == 0)
return 0;
if (m == 2)
{
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)//是闰年
{
if (d > 29)
return 0;
}
else
if (d > 28)
return 0;
}
else
if (d > day_per_month[m])
return 0;
return 1;
}
void get_ymd(void)
{
year = dateNum / 10000;
month = dateNum % 10000 / 100;
day = dateNum % 100;
}
bool judge_prime(int y, int m, int d)
{
int k = 0;
for (int i = 2; i <= num; i++)
{
if (pr[i] == m * 100 + d)
k++;
if (pr[i] == d)
k++;
}
for (int i = 2; i <= num; i++)
{
if (dateNum % pr[i] == 0)
return 0;
}
if (k != 2)
return 0;
}
void dfs(int step)
{
if (step > 8)
{
get_ymd();
if (legal_date(year, month, day) && judge_prime(year, month, day))
{
// printf("%d,%d,%d\n", year, month, day);
ans++;
}
return;
}
if (date[step] != -1)
{
dateNum = dateNum * 10 + date[step];
dfs(step + 1);
dateNum /= 10;
return;
}
for (int i = 0; i <= 9; i++)
{
dateNum = dateNum * 10 + i;
date[step] = i;
dfs(step + 1);
dateNum /= 10;
date[step] = -1;
}
}
int main()
{
char s[10];
prime_get();
int t;
cin >> t;
while (t--)
{
int acount = 0;
for (int i = 1; i <= 8; i++)
cin >> s[i];
for (int i = 1; i <= 8; i++) // 转换成数字
{
if (s[i] == '-')
{
date[i] = -1;
acount++;
}
else
date[i] = s[i] - '0';
}
if (acount == 8)
{
cout << "55157" << endl;
continue;
}
dfs(1);
cout << ans << endl;
ans = 0;
}
}
已经过了样例,特判之前也试过--------,能输出55157