Files
2026-09-10 21:12:43 +08:00

154 lines
3.4 KiB
C++

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll T_BC = 1721424LL;
const ll jend = 577737LL;
const int ds[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool runac(int y) { return y % 4 == 0; }
bool runbc(int y) { return y % 4 == 1; }
bool runac_new(int y)
{
return (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
}
ll count_run(ll N)
{
if (N <= 0)
return 0;
return N / 4 - N / 100 + N / 400;
}
ll days_bc(int y)
{
ll years = 4713 - y;
ll leaps = 1179 - (y + 3) / 4;
return years * 365 + leaps;
}
ll days_ac(int y)
{
ll years = y - 1;
ll leaps = years / 4;
return years * 365 + leaps;
}
ll days_new(ll y)
{
if (y <= 1583)
return 0;
ll years = y - 1583;
ll leaps = count_run(y - 1) - count_run(1582);
return years * 365 + leaps;
}
pair<int, int> gett(ll q, bool run)
{
int days[13];
for (int i = 1; i <= 12; ++i)
days[i] = ds[i];
if (run)
days[2] = 29;
int month = 1;
while (q >= days[month])
{
q -= days[month];
++month;
}
return {month, (int)q + 1};
}
void solve(ll r)
{
if (r < T_BC)
{
int el = 1, er = 4713;
while (el < er)
{
int mid = (el + er) / 2;
if (days_bc(mid) <= r)
er = mid;
else
el = mid + 1;
}
int y = el;
ll q = r - days_bc(y);
bool run = runbc(y);
auto [m, d] = gett(q, run);
printf("%d %d %d BC\n", d, m, y);
}
else
{
r -= T_BC;
if (r < jend)
{
int el = 1, er = 1582;
while (el < er)
{
int mid = (el + er + 1) / 2;
if (days_ac(mid) <= r)
el = mid;
else
er = mid - 1;
}
int y = el;
ll q = r - days_ac(y);
bool run = runac(y);
auto [m, d] = gett(q, run);
printf("%d %d %d\n", d, m, y);
}
else
{
r -= jend;
if (r < 78)
{
int y = 1582, m, d;
if (r < 17)
{
m = 10;
d = 15 + r;
}
else
{
r -= 17;
if (r < 30)
{
m = 11;
d = 1 + r;
}
else
{
r -= 30;
m = 12;
d = 1 + r;
}
}
printf("%d %d %d\n", d, m, y);
}
else
{
r -= 78;
ll el = 1583, er = 1000000000LL + 1000000;
while (el < er)
{
ll mid = (el + er + 1) / 2;
if (days_new(mid) <= r)
el = mid;
else
er = mid - 1;
}
ll y = el;
ll q = r - days_new(y);
bool run = runac_new((int)y);
auto [m, d] = gett(q, run);
printf("%d %d %lld\n", d, m, y);
}
}
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
ll q;
scanf("%lld", &q);
solve(q);
}
return 0;
}