1樓
發表于: 2025-5-11 21:56
#include <bits/stdc++.h> using namespace std;
inline bool p_moon(long long n) { if (n < 0) { n++; }
if (n <= 1582) { return (n % 4 == 0); }
return ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0); }
inline long long get_m_d(int yr, int mt) { if (mt == 10 && yr == 1582) { return 21; }
if (mt == 2) { return p_moon(yr) ? 29 : 28; }
if (mt == 4 || mt == 6 || mt == 9 || mt == 11) { return 30; }
return 31; }
inline long long get_y_d(int yr) { if (yr == 1582) { return 355; }
return p_moon(yr) ? 366 : 365; }
constexpr long long four_b_y_d = 365 * 4 + 1, hd_b_y_d = four_b_y_d * 25 - 1, f_hd_b_y_d = hd_b_y_d * 4 + 1;
inline void f_hd_jump(long long& n, int& y, int maxn_year=INT_MAX) { const int py = min(n / f_hd_b_y_d, static_cast<long long>(maxn_year / 400)); y += py * 400; n -= py * f_hd_b_y_d; }
inline void hd_jump(long long& n, int& y, int maxn_year=INT_MAX) { const int py = min(n / hd_b_y_d, static_cast<long long>(maxn_year / 100)); y += py * 100; n -= py * hd_b_y_d; }
inline void four_jump(long long& n, int& y, int maxn_year=INT_MAX) { const int py = min(n / four_b_y_d, static_cast<long long>(maxn_year / 4)); y += py * 4; n -= py * four_b_y_d; }
inline bool year_jump(long long& n, int& y) { long long d = get_y_d(y); if (n >= d) { n -= d; y++; if (y == 0) { y = 1; } return true; } return false; }
inline void jump_to_special(long long& n, int& y) { // fast to 1600 if (n >= 2305448) { n -= 2305448; y = 1600; return; }
if (n >= 365 * 4 + 1) { four_jump(n, y, 4713); while (year_jump(n, y) && y < 1) {} } }
inline void special_judge(long long& n, int& y) { if (y == 1) { four_jump(n, y, 1580); while (year_jump(n, y) && y < 1584) {}
if (y == 1584) { four_jump(n, y, 16); } }
if (y == 1600) { year_jump(n, y); f_hd_jump(n, y); hd_jump(n, y, 399); four_jump(n, y, 99); } }
inline void jump_year(long long& n, int& y) { while (true) { long long d = get_y_d(y); if (n < d) { return; }
n -= d; y++; } }
inline void jump_month(long long& n, int& y, int& m) { while (true) { long long d = get_m_d(y, m); if (n < d) { return; }
n -= d; m++; } }
inline void jump_day(long long& n, int& y, int& m, int& d) { if (!(y == 1582 && m == 10)) { d = n + 1; return; }
d = n + 11; }
inline void print(long long y, int m, int d) { if (y < 0) { cout << d << ' ' << m << ' ' << -y << " BC\n"; } else { cout << d << ' ' << m << ' ' << y << "\n"; } }
inline void sol(long long n) { int yr = -4713, mt = 1, dy = 1; jump_to_special(n, yr); special_judge(n, yr);
jump_year(n, yr); jump_month(n, yr, mt); jump_day(n, yr, mt, dy);
print(yr, mt, dy); }
int main() { cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false);
int q; cin >> q; while (q--) { long long n; cin >> n; sol(n); } return 0; }
|