题目入口:https://www.luogu.com.cn/problem/P7075
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
int Q, y, m, d;
int mon[13] = {29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
ull ans, q;
/*
4713/1/1 BC ~ 1/12/31 1721423d
1/1/1 ~ 1582/10/4 1721424~22995160d
1582/10/15 ~ 1582/12/31 2299161~2299238d
1583/1/1 ~ 1599/12/31 2299239~2305447d
1600/1/1 ~ ∞ 2305448d+
*/
void f1() { //4713/1/1 BC ~ 1/12/31
y -= q / 1461 * 4;
q %= 1461;
if (q >= 366) {
q -= 366;
y--;
y -= q / 365;
q %= 365;
for (int i = 1; i <= 12; i++) {
if (q >= mon[i]) {
q -= mon[i];
m++;
} else {
break;
}
}
} else {
for (int i = 1; i <= 12; i++) {
int j = i;
if (i == 2) {
j = 0;
}
if (q >= mon[j]) {
q -= mon[j];
m++;
} else {
break;
}
}
}
d += q;
cout << d << ' ' << m << ' ' << y << ' ' << "BC" << endl;
return;
}
void f2() { //1/1/1 ~ 1582/10/4
y += q / 1461 * 4;
q %= 1461;
bool run = 0;
for (int i = 1; i <= 4; i++) {
if (i == 4) {
run = 1;
if (q >= 366) {
q -= 366;
y++;
} else {
break;
}
} else {
if (q >= 365) {
q -= 365;
y++;
} else {
break;
}
}
}
for (int i = 1; i <= 12; i++) {
int j = i;
if (run && j == 2) {
j = 0;
}
if (q >= mon[j]) {
q -= mon[j];
m++;
}
}
d += q;
cout << d << ' ' << m << ' ' << y << endl;
return;
}
void f3() { //1582/10/15 ~ 1582/12/31
for (int i = 10; i <= 12; i++) {
if (q >= mon[i]) {
q -= mon[i];
m++;
} else {
break;
}
}
d += q;
cout << d << ' ' << m << ' ' << y << endl;
return;
}
void f4() { //1583/1/1 ~ 1599/12/31
bool run = 1;
for (int i = 1583; i <= 1599; i++) {
if (i % 4 == 0) {
if (q >= 366) {
q -= 366;
y++;
} else {
break;
}
} else {
if (q >= 365) {
q -= 365;
y++;
} else {
run = 0;
break;
}
}
}
for (int i = 1; i <= 12; i++) {
int j = i;
if (i == 2 && run) {
j = 0;
}
if (q >= mon[j]) {
q -= mon[j];
m++;
} else {
break;
}
}
d += q;
cout << d << ' ' << m << ' ' << y << endl;
return;
}
void f5() { //1600/1/1 ~ ∞
y += q / 146097 * 400;
q %= 146097;
bool run;
for (int i = 0; i <= 399; i++) {
run = (i == 0);
if (i % 4 == 0 && i % 100 != 0) {
run = 1;
}
if (run) {
if (q >= 366) {
q -= 366;
y++;
} else {
break;
}
} else {
if (q >= 365) {
q -= 365;
y++;
} else {
break;
}
}
}
for (int i = 1; i <= 12; i++) {
int j = i;
if (i == 2 && run) {
j = 0;
}
if (q >= mon[j]) {
q -= mon[j];
m++;
} else {
break;
}
}
d += q;
cout << d << ' ' << m << ' ' << y << endl;
return;
}
int main() {
cin >> Q;
for (int i = 1; i <= Q; i++) {
cin >> q;
if (q <= 1721423) {
y = 4713, m = 1, d = 1;
f1();
} else if (q <= 2299160) {
y = 1, m = 1, d = 1;
q -= 1721424;
f2();
} else if (q <= 2299238) {
y = 1582, m = 10, d = 14;
q -= 2299161;
f3();
} else if (q <= 2305447) {
y = 1583, m = 1, d = 1;
q -= 2299239;
f4();
} else {
y = 1600, m = 1, d = 1;
q -= 2305448;
f5();
}
}
return 0;
}