参考题解:Here.
#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int Mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int n,y = -4737,m = 1,d = 1;
int isRun(int y){
if(y <= 0){
y = -y;
return y % 4 == 1;
}
if(y <= 1582)
return y % 4 == 0;
return (y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0));
}
void GetNxtDay(){
d++;
if(y == 1582 && m == 10 && d == 5)
d = 15;
if((d > Mon[m]) + (m == 2 && isRun(y)))
m++,d = 1;
if(m > 12)
y++,m = 1;
return;
}
int ChkDay(int x){
int day = 1ll * (x + 4712) * 365;
if(x > 1582)
day -= 10;
day += 1ll * (x + 4712 + 3) / 4;
if(x >= 1600){
x -= 1601;
day -= (ll)x / 100ll;
day += (ll)x / 400ll;
}
return day;
}
signed main(){
int Q;
scanf("%d",&Q);
while(Q--){
y = 0,m = 1,d = 1;
scanf("%d",&n);
int lft = -4712;
int rgt = 1e9+1;
while(lft <= rgt){
int mid = (lft + rgt) / 2;
if(ChkDay(mid) <= n){
y = mid;
lft = mid + 1;
}
else
rgt = mid - 1;
}
n -= ChkDay(y);
if(y <= 0)
y--;
while(n--)
GetNxtDay();
printf("%d %d ",d,m);
if(y <= 0)
printf("%d BC\n",-y);
else
printf("%d\n",y);
}
return 0;
}