过了大样例,WA #5 #6 #7 #8 #9 #10
#include <cstdio>
#include <cctype>
#define int long long
template <class I> inline void read(I & x) {
x = 0;
int w = 1;
char c = ' ';
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') c = getchar(), w *= -1;
while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
x *= w;
}
template<class I> inline void read(I & a, I & b) {read(a), read(b);}
template<class I> inline void read(I & a, I & b, I & c) {read(a, b), read(c);}
const int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int q;
unsigned long long r;
inline bool pd(int ye) {
if (ye < 0)
return ye % 4 == -1;
else if (ye < 1582)
return !(ye % 4);
else
return (!(ye % 400)) || ((!(ye % 4)) && (ye % 100));
}
inline int getd(int ye) {
return pd(ye) ? 366 : 365;
}
inline int getdd(int ye, int m) {
return m == 2 ? (pd(ye) ? 29 : 28) : days[m];
}
signed main(void) {
//#ifndef DEBUG
//freopen("julian.in", "r", stdin);
//freopen("julian.out", "w", stdout);
//#endif
read(q);
while (q--) {
read(r);
if (r <= 365) { //subtask 1
int mon = 1;
++r;
const int ddays[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
while (r > ddays[mon])
r -= ddays[mon],
++mon;
printf("%llu %lld %d BC\n", r, mon, 4713);
} else if (r < 1721424) { //Before Century
int y = -4713, m = 1;
++r;
y += (r - 1) / 1461 * 4,
r = (r - 1) % 1461 + 1;
while (r > getd(y))
r -= getd(y),
++y;
while (r > getdd(y, m))
r -= getdd(y, m),
++m;
printf("%llu %lld %lld BC\n", r, m, -y);
} else if (r < 2299161) { //Before Gregorian(at 10, 4, 1582)
r -= 1721424,
++r;
int y = 1, m = 1;
y += (r - 1) / 1461 * 4,
r = (r - 1) % 1461 + 1;
while (r > getd(y))
r -= getd(y),
++y;
while (r > getdd(y, m))
r -= getdd(y, m),
++m;
printf("%llu %lld %lld\n", r, m, y);
} else {
r -= 2299161,
++r;
int y = 1582, m = 10;
if (r <= 17) {
printf("%llu %lld %lld", 14 + r, m, y);
continue;
}
r -= 17, m = 11;
if (r <= 30) {
printf("%llu %lld %lld", r, m, y);
continue;
}
r -= 30, m = 12;
if (r <= 31) {
printf("%llu %lld %lld", r, m, y);
continue;
}
r -= 31, m = 1, y = 1583;
y += (r - 1) / 146097 * 400,
r = (r - 1) % 146097 + 1;
while (r > getd(y))
r -= getd(y),
++y;
while (r > getdd(y, m))
r -= getdd(y, m),
++m;
printf("%llu %lld %lld\n", r, m, y);
}
}
return 0;
}