最后一个点T 求调
查看原帖
最后一个点T 求调
92359
MisakaQAQ楼主2024/10/24 13:29
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
inline long long read(){
    long long x = 0,fl = 0;char ch = getchar();
    while(ch < '0'||ch > '9'){if(ch == '-')fl = 1;ch = getchar();}
    while(ch >= '0'&&ch <= '9'){x = (x<<1)+(x<<3)+(ch^48);ch = getchar();}
    return fl ? -x : x;
}
const long long N = 4e6;
long long sum[N],top;
long long month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(long long n){
    if(n <= 1582){
        if(n%4==0)return 1;
        return 0;
    }
    else{
        if(n%100)return (n%4?0:1);
        else return (n%400?0:1);
    }
    return 0;
}
void init(){
    long long n = 1e9,i;
    for(i = 1; sum[i-1]<=n; i++){
        if(i <= 4713){
            if((4714-i-1)%4==0)sum[i] = sum[i-1] + 366;
            else sum[i] = sum[i-1] + 365;
        }
        else {
            if(i-4713==1582)sum[i] = sum[i-1] + 355;
            else{
                if(check(i-4713))sum[i] = sum[i-1] + 366;
                else sum[i] = sum[i-1] + 365;
            }
        }
    }
    top = --i;
   /* for(long long i = 1; i <= 1600+4173; i++){
        if(i <= 4173){
            if((4714-i-1)%4==0)cout << 4174-i << endl;
        }
        else{
            if(check(i-4173))cout << i-4173 << endl;
        }
    }*/
}
int main(){
    init();
    long long T= read();
    for(long long o = 1; o <= T; o++){
        long long flag = 0;
        long long flagrun = 0;
        long long day = read();
        day++;
        long long l = 1,r = top;
        long long year;
        r = lower_bound(sum+1,sum+1+top,day)-sum;
        l = r-1;
        if(r <= 4713){
            year = 4714-r;
            flag = 1;
            if((year-1)%4==0)flagrun = 1;
        }
        else {
            year = r-4713;
           if(check(year))flagrun = 1;
        }
        if(flagrun)month[2]++;
        if(year==1582&&flag==0)month[10]-=10;
        day-=sum[l];
        
        long long mon = 1;
        for(; day>0; mon++)
            day -= month[mon];
        mon--;
        day += month[mon];
        long long Day = 0;
        for(Day = 0; day;){
            day--;
            Day++;
            if(Day == 5&&year == 1582 && flag == 0 && mon == 10)
                Day = 15;
        }
      
        if(flag) printf("%lld %lld %lld BC\n",Day,mon,year);
        else printf("%lld %lld %lld\n",Day,mon,year);
        if(flagrun)month[2]--;
        if(year==1582&&flag==0)month[10]+=10;
    }
    return 0;
}
2024/10/24 13:29
加载中...