蒟蒻样例过不了求助
查看原帖
蒟蒻样例过不了求助
828664
Llx2022楼主2023/8/24 13:55

HeLp\color{red}{}{HeLp}

#include<iostream>
using namespace std;
const int N=1e5+8;
#define int long long
//4713 1 1 BC
//[4713 1 1 BC,1582 10 4] ,29闰年(n%4==0)即可
//无公元0年,1,5,9BC为闰年
//[1582 10 5,1582 10 14] 10天删除,即[1582 10 4]->[1582 10 15]
//[1582 10 15] 平年,29闰年(n%4==0&&n%100!=0)||(n%400==0)
int n;
int sum[N];
int bai[N];
int _1582;
long long res;
bool check(int mid){
    int ans=0;
    if(mid==0){
        ans=sum[1];
    }
    if(mid<0){
        ans+=sum[-mid];
    }
    else{
        if(mid<1582){
            ans=sum[1];
            int mo=mid%4;
            int s=mid/4;
            int zuhe=365*3+366;
            ans+=zuhe*s+mo*365;
        }
        else{
            ans=_1582-10;
            int day=mid-1582+2;
            int mo=day%4;
            int s=day/4;
            int zuhe=365*3+366;
            ans+=zuhe*s+mo*365;
            int _100=day/100;
            int _400=day/400;
            ans=ans-_100+_400;
        }
    }
    if(ans<=res){
        return 1;
    }
    else{
        return 0;
    }
}
int monp[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int monr[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int mp,mr;
signed main(){
    for(int i=1;i<=12;i++){
        mp+=monp[i];
        mr+=monr[i];
    }
    for(int i=4713;i>0;i--){
        if((i-1)%4==0){
            sum[i]=sum[i+1]+mr;
        }
        else{
            sum[i]=sum[i+1]+mp;
        }
    }
    int mo=1582%4;
    int s=1582/4;
    int zuhe=365*3+366;
    _1582=sum[1]+zuhe*s+mo*365;
    cin>>n;
    while(n--){
        cin>>res;
        int l=-4714,r=1e9;
        int ans=0;
        while(l<=r){
            int mid=(l+r)>>1;
            // cout<<l<<" "<<r<<" "<<mid<<" "<<endl;
            if(check(mid)) ans=mid,l=mid+1;
            else r=mid-1;
        }
        int totday=0;
        if(ans>0){
            if(ans<1582){
                totday=sum[1];
                int mo=ans%4;
                int s=ans/4;
                int zuhe=365*3+366;
                totday+=zuhe*s+mo*365;
            }
            else if(ans>=1582){
                totday=_1582-10;
                int day=ans-1582+2;
                int mo=day%4;
                int s=day/4;
                int zuhe=365*3+366;
                totday+=zuhe*s+mo*365;
                int _100=day/100;
                int _400=day/400;
                int num=-_100+_400;
                totday+=num;
            }
            ++ans;
            int y=ans,m=0,d=0;
            int residue=res-totday;
            int prefix=0;
            cout<<residue<<" ";
            if(y==1582){
                bool flag=1;
                for(int i=1;i<=9;i++){
                    prefix+=monp[i];
                    if(prefix>=residue){
                        m=i;
                        d=(residue-prefix+monp[i]);
                        flag=0;
                        break;
                    }
                }
                if(flag){
                    prefix+=monp[10]-10;
                    if(prefix>=residue){
                        m=10;
                        d=(residue-prefix+monp[10]-10);
                        if(d>=5) d+=10;
                        flag=0;
                        break;
                    }
                    for(int i=11;i<=12;i++){
                        prefix+=monp[i];
                        if(prefix>=residue){
                            m=i;
                            d=(residue-prefix+monp[i]);
                            flag=0;
                            break;
                        }
                    }
                }
            }
            else{
                if(ans>1582){
                    for(int i=1;i<=12;i++){
                        if((ans%4==0&&ans%100!=0)||(ans%400==0)) prefix+=monr[i];
                        else prefix+=monp[i];
                        if((prefix>=residue)&&((ans%4==0&&ans%100!=0)||(ans%400==0))){
                            m=i;
                            d=(residue-prefix+monr[i]);
                            break;
                        }
                        if(prefix>=residue){
                            m=i;
                            d=(residue-prefix+monp[i]);
                            break;
                        }
                    }
                }
                else{
                    for(int i=1;i<=12;i++){
                        if(ans%4==0) prefix+=monr[i];
                        else prefix+=monp[i];
                        if((prefix>=residue)&&(ans%4==0)){
                            m=i;
                            d=(residue-prefix+monr[i]);
                            break;
                        }
                        if(prefix>=residue){
                            m=i;
                            d=(residue-prefix+monp[i]);
                            break;
                        }
                    }
                }
                
            }
            cout<<d<<" "<<m<<" "<<y<<endl;
        }
        
    }
    return 0;
}
2023/8/24 13:55
加载中...