题目描述:
相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》
我们称一个日期为一个八位数,第1~4位构成年,第5~6位构成月,第7~8位构成日,不足位数用0补足。同时,要求日期所代表的这一天真实存在,且年的范围为1~9999。
出现奇迹的日期都存在相同的特点:由“日”组成的两位数,由“月+日”组成的四位数,由“年+月+日”组成的八位数均为质数。但并不是所有存在这样特点的日期都一定会出现奇迹。
现在,你得到了一个可能会出现奇迹的日期,然而不幸的是这个日期却是残缺的,八位中可能有若干位无法确定。你需要知道这个日期有多少种可能,这样你才能做好充足的准备去迎接奇迹的到来。
出现奇迹的日期都存在相同的特点:由“日”组成的两位数,由“月+日”组成的四位数,由“年+月+日”组成的八位数均为质数。但并不是所有存在这样特点的日期都一定会出现奇迹。
现在,你得到了一个可能会出现奇迹的日期,然而不幸的是这个日期却是残缺的,八位中可能有若干位无法确定。你需要知道这个日期有多少种可能,这样你才能做好充足的准备去迎接奇迹的到来。
输入
本题有多组数据。
第一行一个正整数T,表示数据组数。
接下来的T行,每行一个八位字符串。其中第i位如果为 -,则表示日期的第i位无法确定,否则表示日期的第i位为字符串中第i位上的数字。
第一行一个正整数T,表示数据组数。
接下来的T行,每行一个八位字符串。其中第i位如果为 -,则表示日期的第i位无法确定,否则表示日期的第i位为字符串中第i位上的数字。
输出
对每组数据,一行一个整数,表示答案。
样例输入
2 53-7-3-7 20190629
样例输出
6 0
提示
53-7-3-7 的 种可能的日期如下:
53070307
53070317
53170307
53370307
53570317
53770307
一共10个测试点,记c为八位字符串中 - 的个数。
对前9个测试点,在第i个测试点中保证c=i-1。
对100%的数据保证1≤T≤10。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int a[] = {0,3,5,7,11,13,17,19,23,29,31,37}; 5 const int b[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 6 int c[200],d[607000],k,kk,t,ans; 7 char s[10]; 8 inline bool prime(int x) { 9 int k=sqrt(x); 10 for (int i = 2;i <= k; i++) { 11 if (x % i == 0) { 12 return 0; 13 } 14 } 15 return 1; 16 } 17 int main() { 18 for (int i = 1; i <=12; i++) { 19 for (int j = 1; a[j] <= b[i]; j++) { 20 if (prime(i * 100 + a[j])){ 21 c[k++] = i * 100 + a[j]; 22 } 23 } 24 } 25 for (int i = 4; i <= 9999; i +=4) { 26 if ((i % 100 || !(i%400)) && prime(i * 10000 + 229)) { 27 d[kk++] = i * 10000 + 229; 28 } 29 } 30 for (int i = 1; i <= 9999; i++) { 31 for (int j = 0; j < k; j++) { 32 if (prime(i * 10000 + c[j])) { 33 d[kk++] = i * 10000 + c[j]; 34 } 35 } 36 } 37 scanf("%d", &t); 38 while (t--) { 39 ans=0; 40 scanf("%s", s); 41 for (int i = 0; i < kk; i++) { 42 int k1 = d[i], f = 1; 43 for (int j = 7; j>=0; j--) { 44 if (s[j] != '-' && s[j] - '0' != k1 % 10) { 45 f = 0; 46 break; 47 } 48 k1 = k1 / 10; 49 } 50 if (f) { 51 ans++; 52 } 53 } 54 printf("%d ", ans); 55 } 56 }