P5440 【XR-2】奇迹

我们称一个日期为一个八位数,第 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;
    }
}
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11110479.html