本来以为自由活动时间给我了,洗完澡可以在机房享受,结果从5点调到7点,特此记录一下。
解题思路
看完题解后显然这是一道暴搜,想了想最暴力的搜索,逐位填充并判断,写了一个小时左右,写不出来,想了想好像实在是太复杂了,有太多东西需要同时考虑。因此选择了看题解。
题解中的思路大多是先把满足性质的所有数打出来后,将输入与全部数依次匹配,算出个数即可。
在看完题解后自己按思路打了一遍,去掉了一些自己以为不正确的东西,就这样交了又错,改了再交,再交再错,改到最后与题解唯一的不同只有数组中的那一个37了,当时我以为这37一定是用不到的,因为一个月最多只有31天,但是我错了,照我的写法后面会日期为0,会有错,淦。
调了几乎半小时,留作纪念。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e6+10;
int t,cnt,cnt1;
char s[10];
int d[20]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int p[40]={0,3,5,7,11,13,17,19,23,29,31,37};//这里后面没打37的时候WA了,因为在下面的循环中可能会导致访问到0,会出错。
int a[N],b[N];
bool is(int x){
for(int i=2;i<=x/i;i++){
if(!(x%i)) return 0;
}
return 1;
}
bool run(int x){
if((!(x%4)&&x%100)||!(x%400))return 1;
return 0;
}
int main(){
//freopen("2.in","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
for(int i=1;i<=12;i++){
for(int j=1;p[j]<=d[i];j++){
if(is(i*100+p[j])) a[++cnt]=i*100+p[j];
}
}
for(int i=4;i<=9999;i+=4){
if(run(i)&&is(i*10000+229))b[++cnt1]=i*10000+229;
}
for(int i=1;i<=9999;i++){
for(int j=1;j<=cnt;j++){
if(is(i*10000+a[j]))b[++cnt1]=i*10000+a[j];
}
}
cin>>t;
while(t--){
cin>>s+1;
int ans=0;
for(int j=1;j<=cnt1;j++){
int x=b[j],f=1;
for(int i=8;f&&i;i--,x/=10){
if(s[i]!='-'&&s[i]-'0'!=x%10) f=0;
}
ans+=f;
}
cout<<ans<<'\n';
}
return 0;
}