1 条题解

  • 0
    @ 2025-8-24 22:26:25

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 「已注销」
    这个家伙很弱,什么也没有留下

    搬运于2025-08-24 22:26:25,当前版本为作者最后更新于2020-11-09 21:13:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    在一种历法中,日期计算以400年为周期,每400年都有恰好146097天

    预处理出400年内的情况,将年份模400即可快速得到答案

    几个简化代码的技巧:

    对于格里高利历,以1200年1月1日为起始日,rr减去跳过的天数(2159351)

    判断历法:r2299160r\leqslant2299160即为儒略历

    公元前xx年视为1x1-x

    #include<bits/stdc++.h>
    typedef long long ll;
    const int N=146097;//格里高利历400年的天数
    int T,y[N],m[N],d[N];
    ll n,t;
    inline int md(int y,int m){//格里高利历y年m月的天数
        if(m==2)return y%4?28:y%100?29:y%400?28:29;
        return m==4||m==6||m==9||m==11?30:31;
    }
    int main(){
        m[0]=d[0]=1;
        for(int i=1;i<N;++i){
            d[i]=d[i-1]+1;m[i]=m[i-1];y[i]=y[i-1];
            if(d[i]>md(y[i],m[i]))++m[i],d[i]=1;
            if(m[i]>12)++y[i],m[i]=1;
        }//y[i],m[i],d[i]分别表示从0年1月1日经过i天的年月日
        scanf("%d",&T);
        while(T--){
            scanf("%lld",&n);
            if(n>2299160){//格里高利历
                n-=2159351;
                t=n/N*400+1200;
                n%=N;
            }else{
                t=n/1461*4-4712;//1461是儒略历4年的天数
                n%=1461;
            }
            if(t+y[n]>0)printf("%d %d %lld\n",d[n],m[n],t+y[n]);
            else printf("%d %d %lld BC\n",d[n],m[n],1-t-y[n]);
        }
    }
    
    • 1

    信息

    ID
    6257
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者