每个数据天数都少一天...
#include <iostream>
#include <cstdio>
using namespace std;
long long q,r,d,m,y;
int a[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,50};
int gy=-1;
bool rn(long long x)
{
if(x>=0)
{
if(x>1582)
{
if(x%400==0) return 1;
if(x%100!=0&&x%4==0) return 1;
return 0;
}
else if((x+1)%4==0) return 1;
else return 0;
}
else {
if((-x-1)%4==0) return 1;
return 0;
}
}
void cal0()
{
int i=1;
while(r>=a[i]&&i<=12)
{
r-=a[i];
m++;
if(i==2&&rn(y)) r--;
if(r<0) r++,r+=a[i],m--; //
i++;
}
if(r<a[i]) d+=r,r=0;
else y++,m=1;
}
void cal1()
{
if(r>=17) r-=17,d=1,m=11;
while(r>365)
{
if(rn(++y)) r-=366;
else r-=365;
}
if(r>=365&&!rn(y+1)) r-=365,++y;
int i=11,j=0;
while(r>=a[i]&&j<=12)
{
r-=a[i];
m++;
if(m==13) m-=12,y++,i=0;
if(i==2&&rn(y)) r--;
if(r<0) r++,r+=a[i],m--; //
i++;j++;
}
if(r<a[i]) d+=r,r=0;
}
void cal2()
{
while(r>365)
{
if(rn(y)) r-=366,y++;
else r-=365,y++;
}
if(r>=365&&!rn(y)) r-=365,++y;
int i=1;
while(r>=a[i]&&i<=12)
{
r-=a[i];
m++;
if(i==2&&rn(y)) r--;
if(r<0) r++,r+=a[i],m--; //
i++;
}
if(r<a[i]) d+=r,r=0;
}
int main()
{
scanf("%lld",&q);
while(q--)
{
scanf("%lld",&r);
d=1,m=1,y=-4713;
cal0();
if(r>0)
{
if(r<2298795) y+=(r/1461)*4,r%=1461,cal2();
else if(r==2298795) d=4,m=10,y=1582;
else if(r>=2298796&&r<2305082) d=15,m=10,y=1582,r-=2298796,cal1();
else if(r==2305082) d=1,m=1,y=1600;
else if(r>2305082) d=1,m=1,y=1600,r-=2305082,y+=(r/146097)*400,r%=146097,cal2();
if(y>=0&&y<1582) y++;
}
while(m>12) m-=12,y++;
while(d>a[m]&&m<=12)
{
if(m==2&&rn(y)) if(d<=29) break;
else d--;
d-=a[m];
m++;
if(m>12) m-=12,y++;
}
printf("%lld %lld ",d,m);
if(y<0) printf("%lld BC\n",-y);
else printf("%lld\n",y);
}
return 0;
}