奇迹

题目描述:

相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》
我们称一个日期为一个八位数,第1~4位构成年,第5~6位构成月,第7~8位构成日,不足位数用0补足。同时,要求日期所代表的这一天真实存在,且年的范围为1~9999。
出现奇迹的日期都存在相同的特点:由“日”组成的两位数,由“月+日”组成的四位数,由“年+月+日”组成的八位数均为质数。但并不是所有存在这样特点的日期都一定会出现奇迹。
现在,你得到了一个可能会出现奇迹的日期,然而不幸的是这个日期却是残缺的,八位中可能有若干位无法确定。你需要知道这个日期有多少种可能,这样你才能做好充足的准备去迎接奇迹的到来。

输入

本题有多组数据。
第一行一个正整数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 }
View Code
原文地址:https://www.cnblogs.com/Accpted/p/11203384.html