1 条题解

  • 0
    @ 2025-9-10 9:12:25

    C++ :

    //FJ-00445
    //NOIP2020 RP++
    #include<iostream>
    #include<cstdio>
    #define ll long long
    using namespace std;
    int T;
    int mp[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年的一月周期
    int mr[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年的一月周期
    int sp[12]={31,28,31,30,31,30,31,31,30,21,30,31};//1582的一月周期
    int yp[4]={366,365,365,365};//一年周期
    ll n,ans;
    void solve1()//1581-
    {
        ans=n/1461*4;n%=1461;ll p,q;//四年周期
        for(p=0;p<4 && n>=yp[p];p++)
            n-=yp[p],ans++;//一年周期
        if(!p)//第一年为闰年
            for(q=0;q<12 && n>=mr[q];q++)
                n-=mr[q];//闰年的一月周期
        else
            for(q=0;q<12 && n>=mp[q];q++)
                n-=mp[q];//平年的一月周期
        if(ans<4713)
            printf("%lld %lld %lld BC\n",n+1,q+1,4713-ans);//公元前
        else
            printf("%lld %lld %lld\n",n+1,q+1,ans-4713+1);//公元后
    }
    void solve2()//1583+
    {
        n-=2299239;ans=1583;ll p,q;//快进到1583
        if(n<365)//1583 
            for(q=0;q<12 && n>=mp[q];q++)
                n-=mp[q];//平年的一月周期
        else
            if(n<6209)//1584-1599
            {
                n-=365;ans++;//快进到1584
                ans+=n/1461*4;n%=1461;
                for(p=0;p<4 && n>=yp[p];p++)
                    n-=yp[p],ans++;
                if(!p)
                    for(q=0;q<12 && n>=mr[q];q++)
                        n-=mr[q];
                else
                    for(q=0;q<12 && n>=mp[q];q++)
                        n-=mp[q];
            }
            else//1600+
            {
                n-=6209;ans=1600;//快进到1600
                ans+=n/146097*400;n%=146097;//四百年周期
                if(n<366)//只有第一个世纪年为闰年
                    for(q=0;q<12 && n>=mr[q];q++)
                        n-=mr[q];
                else
                {
                    n--;//假装是第一个世纪年是平年,按照一般的一百年周期计算
                    ans+=n/36524*100;n%=36524;//一百年周期
                    if(n<365)//其余的世纪年均为平年
                        for(q=0;q<12 && n>=mp[q];q++)
                            n-=mp[q];
                    else
                    {
                        n++;//假装世纪年为闰年,按照一般的四年周期计算
                        ans+=n/1461*4;n%=1461;
                        for(p=0;p<4 && n>=yp[p];p++)
                            n-=yp[p],ans++;
                        if(!p)
                            for(q=0;q<12 && n>=mr[q];q++)
                                n-=mr[q];
                        else
                            for(q=0;q<12 && n>=mp[q];q++)
                                n-=mp[q];
                    }
                }
            }
        printf("%lld %lld %lld\n",n+1,q+1,ans);
    }
    void solve3()//1582
    {
        n-=2298884;ans=1582;ll q;//快进到1582
        for(q=0;q<12 && n>=sp[q];q++)
            n-=sp[q]; 
        if(q==9 && n>3)//10月特判
            n+=10;
        printf("%lld %lld %lld\n",n+1,q+1,ans);
    }
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%lld",&n);
            if(n<2298884)
                solve1();
            else
                if(n>2299238)
                    solve2();
                else
                    solve3();
        }
        return 0;
    }
    
    • 1

    信息

    ID
    3825
    时间
    4000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者