和题解对拍没发现错误
//P7075
/*
365+365+365+366=1461
1600~1999天数:146097
1721424 1.1.1
2298884 1582.1.1
2299160 1582.10.4
2305448 1600.1.1
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const ll DayinM[13] = {0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
ll kd[146097],km[146097],ky[146097];
ll n;
bool isLeapYear(ll y){
// if(y<1582) return (y%4 ? 0 : 1);
return (y%400 ? (y%4 ? 0 : (y%100 ? 1 : 0)) : 1);
}
int getDaycnt(ll y,ll m){
if(m != 2) return DayinM[m];
return isLeapYear(y) ? 29 : 28;
}
int getMonthDay(ll diny, bool isly){
ll Month, Day, sum = 0;
for(int i = 1; i <= 12; ++ i){
sum += getDaycnt(isly ? 4 : 3, i);
if(diny < sum){
Month = i;
sum -= getDaycnt(isly ? 4 : 3, i);
Day = diny - sum + 1;
printf("%lld %lld ", Day, Month);
return 0;
}
}
return 0;
}
inline void bf(ll k){
int Year = 1582, Month = 10, Day = 15;
for(ll i = 2299162; i <= k; ++ i){
int MonthEnd = getDaycnt(Year, Month);
if(Day < MonthEnd) ++ Day;
else {
Day = 1;
if(Month < 12) ++ Month;
else Month = 1, ++ Year;
}
// if(Year == 1599 && Month == 12 && Day == 31){
// printf("%lld %lld %lld %lld\n", i, Day, Month, Year);
// return;
// }
}
printf("%lld %lld %lld\n", Day, Month, Year);
return;
}
void func(){
int Year = 0, Month = 1, Day = 1;
for(int i = 0; i < 146097; ++ i){
ky[i] = Year, km[i] = Month, kd[i] = Day;
int MonthEnd = getDaycnt(Year, Month);
// if(Year%100==0 && Year%400!=0 && MonthEnd == 29) MonthEnd = 28;
if(Day < MonthEnd) ++ Day;
else {
Day = 1;
if(Month < 12) ++ Month;
else Month = 1, ++ Year;
}
}
return;
}
inline int solve(){
scanf("%lld", &n);
if(n <= 1721423){
int k = n / 1461;
n %= 1461;
if(n < 366){
getMonthDay(n, 1);
printf("%lld BC\n", 4713 - k * 4 - 0);
} else if(n < 366 + 365){
getMonthDay(n - 366, 0);
printf("%lld BC\n", 4713 - k * 4 - 1);
} else if(n < 366 + 365 + 365){
getMonthDay(n - 366 - 365, 0);
printf("%lld BC\n", 4713 - k * 4 - 2);
} else if(n < 366 + 365 + 365 + 365){
getMonthDay(n - 366 - 365 - 365, 0);
printf("%lld BC\n", 4713 - k * 4 - 3);
}
} else if(n <= 2299160){
n -= 1721424;
ll k = n / 1461;
n %= 1461;
if(n < 365){
getMonthDay(n, 1);
printf("%lld\n", k * 4 + 1);
} else if(n < 365 + 365){
getMonthDay(n - 365, 0);
printf("%lld\n", k * 4 + 2);
} else if(n < 365 + 365 + 365){
getMonthDay(n - 365 - 365, 0);
printf("%lld\n", k * 4 + 3);
} else if(n < 365 + 365 + 365 + 366){
getMonthDay(n - 365 - 365 - 365, 0);
printf("%lld\n", k * 4 + 4);
}
} else if(n <= 2305447){
bf(n);
} else {
n -= 2305448;
int k = n / 146097;
n %= 146097;
printf("%lld %lld %lld\n", kd[n], km[n], ky[n] + 1600 + k * 400);
}
return 0;
}
signed main(){
// freopen("julian3.in","r",stdin);
// freopen("julian3.out","w",stdout);
int Q;
func();
scanf("%lld", &Q);
while(Q--) solve();
return 0;
}