#include <bits/stdc++.h>
#define isLeap1(y) (y % 4 == 0)
#define yDay1(y) ((isLeap1(y)) ? 366 : 365)
#define isLeap2(y) (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
#define yDay2(y) ((isLeap2(y)) ? 366 : 365)
struct Date{
bool isBc;
unsigned long long y, m, d;
};
inline unsigned short queryDay(bool isLeap, unsigned short m){
const unsigned short mDay[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const unsigned short mDayLeap[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return isLeap ? mDayLeap[m - 1] : mDay[m - 1];
}
Date query(unsigned long long r){
unsigned long long y = 0, m = 0, d = 0;
unsigned long long julianCalander4Years = (365 * 4) + 1;
unsigned long long gregorianCalander400Years = (365 * 400) + 97;
// 1 1 4713 BC -> 1 1 1 AD
// 1179 Leap Years
unsigned long long leap = ((4713 - 1) / 4) + 1; // 1179
unsigned long long elapse = 4713 * 365 + leap; // 1721423
if (r >= elapse){
r -= elapse;
}
else {
m = d = 1;
while (r > 0){
if (r < queryDay(isLeap1(y), m)){ // r + 1 <= queryDay
d += r; r = 0;
}
else if (r < yDay1(y)){
r -= queryDay(isLeap1(y), m); m++;
}
else if (r < julianCalander4Years){
r -= yDay1(y); y++;
}
else {
unsigned long long count = r / julianCalander4Years;
r -= count * julianCalander4Years;
y += count * 4;
}
}
return {true, 4713 - y, m, d};
}
// 1 1 1 AD -> 4 10 1582 AD
// 395 Leap Years
leap = 1582 / 4; // 395
elapse = (1582 * 365) + 287 + leap; // 578112
if (r > elapse){
r -= elapse;
}
else if (r == elapse){
return {false, 1582, 10, 4};
}
else {
y = m = d = 1;
while (r > 0){
if (r < queryDay(isLeap1(y), m)){
d += r; r = 0;
}
else if (r < yDay1(y)){
r -= queryDay(isLeap1(y), m); m++;
}
else if (r < julianCalander4Years){
r -= yDay1(y); y++;
}
else {
unsigned long long count = r / julianCalander4Years;
r -= count * julianCalander4Years;
y += count * 4;
}
}
return {false, y, m, d};
}
// 15 10 1582 AD -> +inf
r--;
y = 1582; m = 10; d = 15;
if ( r >= 78 ){
r -= 78;
y++;
m = d = 1;
}
else if ( r >= 17 ){
r -= 17;
m++;
d = 1;
}
while (r > 0){
if (r < queryDay(isLeap2(y), m)){
d += r; r = 0;
}
else if (r < yDay2(y)){
r -= queryDay(isLeap2(y), m); m++;
}
else if (r < gregorianCalander400Years){
r -= yDay2(y); y++;
}
else {
unsigned long long count = r / gregorianCalander400Years;
r -= count * gregorianCalander400Years;
y += count * 400;
}
}
return {false, y, m, d};
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
unsigned q;
std::cin >> q;
while (q--){
unsigned long long r;
std::cin >> r;
Date d = query(r);
std::cout << d.d << " " << d.m << " " << d.y << (d.isBc ? " BC" : "") << std::endl;
}
return 0;
}
似乎在15821015之后稳定差一年+11天,虽然我没看出来哪里出问题了