不想正解,完全可以预处理一天一天往上加,前八个点最多 1e7 跑的下
#include <iostream>
#include <cstdio>
using namespace std;
const int maxr = 1e7 + 1;
int day[maxr], month[maxr], year[maxr];
int common[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int special[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool judge_year(int x) {
if (x < 0) return (-x - 1) % 4 == 0;
if (x <= 1582) return x % 4 == 0;
if (x % 100 == 0) return x % 400 == 0;
return x % 4 == 0;
}
int main() {
day[0] = 1;
month[0] = 1;
year[0] = -4713;
for (int r = 1; r < maxr; r++) {
int y = year[r - 1];
int m = month[r - 1];
int d = day[r - 1] + 1;
if (m == 12 && d == 32) {
year[r] = y + 1 + (y == -1);
month[r] = 1;
day[r] = 1;
continue;
}
if (y == 1582 && m == 10 && d == 5) {
year[r] = 1582;
month[r] = 10;
day[r] = 15;
continue;
}
if (judge_year(y)) {
if (d == special[m] + 1) {
year[r] = y;
month[r] = m + 1;
day[r] = 1;
continue;
} else {
year[r] = y;
month[r] = m;
day[r] = d;
continue;
}
} else {
if (d == common[m] + 1) {
year[r] = y;
month[r] = m + 1;
day[r] = 1;
continue;
} else {
year[r] = y;
month[r] = m;
day[r] = d;
continue;
}
}
}
int T, x; scanf("%d", &T);
while (T--) {
scanf("%d", &x);
if (year[x] < 0) {
printf("%d %d %d BC\n", day[x], month[x], -year[x]);
} else {
printf("%d %d %d\n", day[x], month[x], year[x]);
}
}
return 0;
}