社区讨论

40的废物

P7075[CSP-S 2020] 儒略日参与者 3已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lo3ff0jz
此快照首次捕获于
2023/10/24 05:45
2 年前
此快照最后确认于
2023/10/24 05:45
2 年前
查看原帖
前面没问题后面误差越来越大
CPP
#include<bits/stdc++.h>
#define debug(x) cerr<<#x<<"="<<(x)<<endl;
using namespace std;
long long Q,r,BCyear[4715],yue1[15]={0,31,31+28,31+28+31,31+28+31+30,31+28+31+30+31,31+28+31+30+31+30,31+28+31+30+31+30+31,31+28+31+30+31+30+31+31,31+28+31+30+31+30+31+31+30,31+28+31+30+31+30+31+31+30+31,31+28+31+30+31+30+31+31+30+31+30,31+28+31+30+31+30+31+31+30+31+30+31},yue2[15]={0,31,31+29,31+29+31,31+29+31+30,31+29+31+30+31,31+29+31+30+31+30,31+29+31+30+31+30+31,31+29+31+30+31+30+31+31,31+29+31+30+31+30+31+31+30,31+29+31+30+31+30+31+31+30+31,31+29+31+30+31+30+31+31+30+31+30,31+29+31+30+31+30+31+31+30+31+30+31};
long long AD15821004qian[1588];
long long AD400[405];
bool panduan(long long x)
{
    if(x%400==0)
    {
        return true;
    }
    else if(x%100==0)
    {
        return false;
    }
    else if(x%4==0)
    {
        return true;
    }
    return false;
}
int main()
{
    scanf("%lld",&Q);
    BCyear[4713]=366;//12.31天数 
    for(int i=4712;i>=1;--i)
    {
        if((i-1)%4==0)
        {
            BCyear[i]=BCyear[i+1]+366;
        }
        else
        {
            BCyear[i]=BCyear[i+1]+365;
        }
    }
    AD15821004qian[1]=365;
    for(int i=1;i<=1582;++i)
    {
        if(i%4==0)
        {
            AD15821004qian[i]=AD15821004qian[i-1]+366;
        }
        else
        {
            AD15821004qian[i]=AD15821004qian[i-1]+365;
        }
    }
    for(int i=1;i<=400;++i)
    {
        if(i%100==0)
        {
            if(i%400==0)
            {
                AD400[i]=AD400[i-1]+366;
            }
            else
                AD400[i]=AD400[i-1]+365;
        }
        else if(i%4==0)
        {
            AD400[i]=AD400[i-1]+366;
        }
        else
        {
            AD400[i]=AD400[i-1]+365;
        }
    }
    while(Q--)
    {
        scanf("%lld",&r);
        if(r<1721424)//BC 4713——BC 1天数 
        {
            ++r;
            int L=1,R=4713,ansyear;
            while(L<=R)
            {
                int mid=(L+R)/2;
                if(BCyear[mid]>=r)
                {
                    ansyear=mid;
                    L=mid+1;
                }
                else
                {
                    R=mid-1;
                }
            }
            r-=BCyear[ansyear+1];
            if((ansyear-1)%4==0)
            {
                int L=1,R=12,ansyue;
                while(L<=R)
                {
                    int mid=(L+R)/2;
                    if(yue2[mid]>=r)
                    {
                        ansyue=mid;
                        R=mid-1;
                    }
                    else
                    {
                        L=mid+1;
                    }
                }
                r-=yue2[ansyue-1];
                printf("%lld %lld %lld BC\n",r,ansyue,ansyear);
            }
            else
            {
                int L=1,R=12,ansyue;
                while(L<=R)
                {
                    int mid=(L+R)/2;
                    if(yue1[mid]>=r)
                    {
                        ansyue=mid;
                        R=mid-1;
                    }
                    else
                    {
                        L=mid+1;
                    }
                }
                r-=yue1[ansyue-1];
                printf("%lld %lld %lld BC\n",r,ansyue,ansyear);
            }
            continue;
        }
        r-=1721423;
        if(r<=577737)
        {
            int L=1,R=1582,ansyear;
            while(L<=R)
            {
                int mid=(L+R)/2;
                if(AD15821004qian[mid]>=r)
                {
                    ansyear=mid;
                    R=mid-1;
                }
                else
                {
                    L=mid+1;
                }
            }
            r-=AD15821004qian[ansyear-1];
            if((ansyear)%4==0)
            {
                int L=1,R=12,ansyue;
                while(L<=R)
                {
                    int mid=(L+R)/2;
                    if(yue2[mid]>=r)
                    {
                        ansyue=mid;
                        R=mid-1;
                    }
                    else
                    {
                        L=mid+1;
                    }
                }
                r-=yue2[ansyue-1];
                printf("%lld %lld %lld \n",r,ansyue,ansyear);
            }
            else
            {
                int L=1,R=12,ansyue;
                while(L<=R)
                {
                    int mid=(L+R)/2;
                    if(yue1[mid]>=r)
                    {
                        ansyue=mid;
                        R=mid-1;
                    }
                    else
                    {
                        L=mid+1;
                    }
                }
                r-=yue1[ansyue-1];
                printf("%lld %lld %lld \n",r,ansyue,ansyear);
            }
            continue;
        }
        r-=577737;
        if(r<=78)
        {
            int nian=1582,yue=10,ri=14;
            for(int i=1;i<=r;++i)
            {
                ++ri;
                if(yue==10&&ri>31)
                {
                    ++yue,ri=1;
                }
                else if(yue==11&&ri>30)
                {
                    ++yue,ri=1;
                }
                if(yue==12&&ri>31)
                {
                    ++nian,yue=1,ri=1;
                }
            }
            printf("%lld %lld %lld \n",ri,yue,nian);
            continue;
        }
        r-=78;
     ////////从这里开始出错
        long long Q=r/146097;
        r=r%146097;
        int L=1,R=400,ansyear;
        while(L<=R)
        {
            int mid=(L+R)/2;
            if(AD400[mid]>=r)
            {
                ansyear=mid;
                R=mid-1;
            }
            else
            {
                L=mid+1;
            }
        }
        r-=AD400[ansyear-1];
        if(panduan(1582+ansyear+400*Q))
        {
            int L=1,R=12,ansyue;
            while(L<=R)
            {
                int mid=(L+R)/2;
                if(yue2[mid]>=r)
                {
                    ansyue=mid;
                    R=mid-1;
                }
                else
                {
                    L=mid+1;
                }
            }
            r-=yue2[ansyue-1];
            printf("%lld %lld %lld \n",r,ansyue,1582+ansyear+400*Q);
        }
        else
        {
            int L=1,R=12,ansyue;
            while(L<=R)
            {
                int mid=(L+R)/2;
                if(yue1[mid]>=r)
                {
                    ansyue=mid;
                    R=mid-1;
                }
                else
                {
                    L=mid+1;
                }
            }
            r-=yue1[ansyue-1];
            printf("%lld %lld %lld \n",r,ansyue,1582+ansyear+400*Q);
        }
    }
    return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...