2020CSPS T1 儒略日记录

这是一道超级大模拟

前后调了差不多3个小时,要是考场上那就已经炸了

题意其实很简单,但是处理起来是真的麻烦

最后写了份特别丑的代码,A过去了

主要是特例判的恶心,总是会有1月0日的错误

这题一定要耐住性子做下来试试

#include <bits/stdc++.h>
using namespace std;
const long long day = 365;
const long long bound = 2299161;
const long long bound2 = 1721424;
vector<long long> month(13);
vector<long long> month2(13);
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
    month2[1] = 31;
    month2[2] = month2[1] + 29;
    month2[3] = month2[2] + 31;
    month2[4] = month2[3] + 30;
    month2[5] = month2[4] + 31;
    month2[6] = month2[5] + 30;
    month2[7] = month2[6] + 31;
    month2[8] = month2[7] + 31;
    month2[9] = month2[8] + 30;
    month2[10] = month2[9] + 31;
    month2[11] = month2[10] + 30;
    month2[12] = month2[11] + 31;
    month[1] = 31;
    month[2] = month[1] + 28;
    month[3] = month[2] + 31;
    month[4] = month[3] + 30;
    month[5] = month[4] + 31;
    month[6] = month[5] + 30;
    month[7] = month[6] + 31;
    month[8] = month[7] + 31;
    month[9] = month[8] + 30;
    month[10] = month[9] + 31;
    month[11] = month[10] + 30;
    month[12] = month[11] + 31;
    long long BY = 3 * day + day + 1;
    long long Q;
    cin>>Q;
    long long r;
    while(Q--) {
        cin>>r;
        r += 1;
        if(r <= bound) {
            if(r <= bound2) {
                long long y = (r / BY) * 4;
                r %= BY;
                if(r == 0) {
                    y--;
                    r += 366;
                }
                if(r <= 366) {
                    long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
                    long long d = r - month2[x - 1];
                    cout<<d<<" "<<x<<" "<<4713 - y<<" "<<"BC"<<"\n";
                }else {
                    r -= 366;
                    y += 1;
                    y += r / 365;
                    r %= 365;
                    if(r == 0) {
                        y--;
                        r += 365;
                    }
                    long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
                    long long d = r - month[x - 1];
                    cout<<d<<" "<<x<<" "<<4713 - y<<" "<<"BC"<<"\n";
                }
            }
            else {
                r -= bound2;
                int flag = 1;
                if(r == 0) flag = 0;
                long long y = (r / BY) * 4;
                r %= BY;
                if(r == 0 && flag == 1) {
                    y--;
                    r += 366;
                    cout<<31<<" "<<12<<" "<<1 + y<<"\n";
                }else {
                y += r / 365;
                if(r / 365 == 3) {
                    r %= 365;
                    if(r == 0) {
                        y--;
                        cout<<31<<" "<<12<<" "<<1 + y<<"\n";
                    }
                    else {
                    long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
                    long long d = r - month2[x - 1];
                    cout<<d<<" "<<x<<" "<<1 + y<<"\n";
                    }
                }
                else if(r / 365 == 4) {
                    y--;
                    r = 365;
                    long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
                    long long d = r - month2[x - 1];
                    cout<<d<<" "<<x<<" "<<1 + y<<"\n";
                }
                else {
                    r %= 365;
                    if(r == 0 && flag) {
                        y--;
                        cout<<31<<" "<<12<<" "<<1 + y<<"\n";
                    }
                    else {
                    long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
                    long long d = r - month[x - 1];
                    cout<<d<<" "<<x<<" "<<1 + y<<"\n";
                    }
                }
                }
            }
        }
        else {
            r -= bound;
            if(r <= 78) {
                r += month[9] + 4;
                r += 10;
                long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
                long long d = r - month[x - 1];
                cout<<d<<" "<<x<<" "<<1582<<"\n";
            }else {
                r -= 78;
                long long year = 1583;
                if(r <= 6575) {
                    if(r <= 365) {
                        long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
                        long long d = r - month[x - 1];
                        cout<<d<<" "<<x<<" "<<1583<<"\n";
                    }
                    else {
                        r -= 365;
                        long long y = (r / BY) * 4;
                        r %= BY;
                        if(r == 0) {
                            y--;
                            r += 366;
                        }
                        if(r <= 366) {
                            long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
                            long long d = r - month2[x - 1];
                            cout<<d<<" "<<x<<" "<<y + 1584<<"\n";
                        }
                        else {
                            r -= 366;
                            y += 1;
                            y += r / 365;
                            r %= 365;
                            if(r == 0) {
                                y--;
                                r += 365;
                            }
                            long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
                            long long d = r - month[x - 1];
                            cout<<d<<" "<<x<<" "<<1584 + y<<"\n";
                        }
                    }
                }
                else {
                    r -= 6575;
                    long long YY = BY * 100 - 3;
                    long long y = (r / YY) * 400;
                    r %= YY;
                    if(r == 0) {
                        y--;
                        r += 366;
                    }
                    else {
                    long long YYY = BY * 25 - 1;
                    y += (r / YYY) * 100;
                    r %= YYY;
                    if(r == 0) {
                        y--;
                        r += 365;
                    }else {
                    y += (r / BY) * 4;
                    r %= BY;
                    if(r == 0) {
                        y--;
                        r += 366;
                    }
                    else {
                    y += r / 365;
                    if(r / 365 == 4) {
                        y--;
                        r -= 365 * 3;
                    }
                    else {
                        r %= 365;
                        if(r == 0) {
                            y--;
                            r += 365;
                        }
                    }
                    }
                    }
                    }
                    if((1601 + y) % 4 == 0 && (1601 + y) % 100 != 0) {
                        long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
                        long long d = r - month2[x - 1];
                        cout<<d<<" "<<x<<" "<<y + 1601<<"\n";
                    }
                    else if((1601 + y) % 400 == 0) {
                        long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
                        long long d = r - month2[x - 1];
                        cout<<d<<" "<<x<<" "<<y + 1601<<"\n";
                    }
                    else {
                        long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
                        long long d = r - month[x - 1];
                        cout<<d<<" "<<x<<" "<<y + 1601<<"\n";
                    }
                }
            }
        }
    }
    return 0;
}
posted @ 2025-10-06 15:15  七月封阳  阅读(10)  评论(0)    收藏  举报