P5440 奇迹

本来以为自由活动时间给我了,洗完澡可以在机房享受,结果从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;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇