我们称一个日期为一个八位数,第 1~4 位构成年,第 5~6 位构成月,第 7~8 位构成日,不足位数用 0 补足。同时,要求日期所代表的这一天真实存在,且年的范围为 1~9999。
出现奇迹的日期都存在相同的特点:由“日”组成的两位数,由“月+日”组成的四位数,由“年+月+日”组成的八位数均为质数。但并不是所有存在这样特点的日期都一定会出现奇迹。
现在,你得到了一个可能会出现奇迹的日期,然而不幸的是这个日期却是残缺的,八位中可能有若干位无法确定。你需要知道这个日期有多少种可能,这样你才能做好充足的准备去迎接奇迹的到来。
——————————————————————————————————————————————————————————
身败名裂
被闰年搞去世了
#include<bits/stdc++.h> using namespace std; int prime[99991232],cnt,n,num[10],id[10],sum,ce; int bol[99991232]; int day[50]={103,503,1103,107,307,607,907,211,311,811,911,113,313,613,1013,1213,317,617,1117,1217,419,619,719,919,1019,223,523,823,1123,1223,829,929,1129,1229,131,331,1031,1231}; int flg[100000]; char ch[10]; int ge() { int ans=0; for(int i=1;i<=8;i++)ans=ans*10+num[i]; if(bol[ans])return 0; if(ans/10000==0)return 0; if(ans%10000==229) { if((((ans/10000)%4==0)&&((ans/10000)%100!=0))||((ans/10000)%400==0)) return 1; else return 0; } if(!flg[ans%10000])return 0; return 1; } void dfs(int pos) { if(id[pos]==5)for(int i=0;i<=1;i++) { num[id[pos]]=i; if(ce==pos){if(ge())sum++;} else dfs(pos+1); } else for(int i=0;i<=9;i++) { num[id[pos]]=i; if(ce==pos){if(ge())sum++;} else dfs(pos+1); } } int main() { bol[1]=1; for(int i=2;i<=99991231;i++) { if(!bol[i])prime[++cnt]=i; for(int j=1;j<=cnt&&i*prime[j]<=99991231;j++) { bol[i*prime[j]]=1; if(i%prime[j]==0)break; } } for(int i=0;i<=49;i++)flg[day[i]]=1; flg[0]=0; cin>>n; while(n--) { memset(id,0,sizeof(id)); ce=0;sum=0; cin>>ch; int len=strlen(ch); for(int j=1;j<=len;j++) { if(ch[j-1]=='-') {id[++ce]=j;if(j==5)flg=1;} else num[j]=ch[j-1]-'0'; } if(ce)dfs(1); else if(ge())sum++; cout<<sum<<endl; } }