rt,只有 30 分
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<ctime>
#define ll long long
#define N number_
#define M number_
using namespace std;
#define MAXN 4000005
#define read(x) scanf("%d",&x)
int q;
ll x;
int lsd,lsm,lsy;
struct node
{
int y,m,d;
}ans[MAXN];
int main()
{
//freopen("julian.in","r",stdin);
//freopen("julian.out","w",stdout);
int d=1,m=1,y=-4713;
for(int i=1;i<=1721424;i++)
{
d++;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
if(d==32) d=1,m++;
}
else if(m!=2)
{
if(d==31) d=1,m++;
}
else
{
if((-y)%4==1&&d==30)
{
d=1,m=3;
}
else if((-y)%4!=1&&d==29)
{
d=1,m=3;
}
}
if(m>12) m=1,d=1,y++;
ans[i].d=d,ans[i].y=y,ans[i].m=m;
}
ans[1721424].y=1;
y=1,d=1,m=1;
for(int i=1721425;i<=2299160;i++)
{
d++;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
if(d==32) d=1,m++;
}
else if(m!=2)
{
if(d==31) d=1,m++;
}
else
{
if(y%4==0&&d==30) d=1,m=3;
else if(y%4!=0&&d==29) d=1,m=3;
}
if(m>12) m=1,d=1,y++;
ans[i].d=d,ans[i].y=y,ans[i].m=m;
}
//cout<<ans[2299148].d<<endl;
ans[2299161].d=15,ans[2299161].y=1582,ans[2299161].m=10;
d=15,m=10,y=1582;
for(int i=2299162;i<=2299969;i++)
{
d++;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
if(d==32) d=1,m++;
}
else if(m!=2)
{
if(d==31) d=1,m++;
}
else if(m==2)
{
if(y%4!=0)
{
if(d==29) d=1,m=3;
}
else
{
if(y%100!=0)
{
if(d==30) d=1,m=3;
}
else
{
if(y%400!=0)
{
if(d==29) d=1,m=3;
}
else
{
if(d==30) d=1,m=3;
}
}
}
}
if(m>12) m=1,d=1,y++;
ans[i].d=d,ans[i].y=y,ans[i].m=m;
}
read(q);
for(int i=1;i<=q;i++)
{
//int ay,ad,am;
scanf("%lld",&x);
//ll ox=x;
if(x<=2299969)
{
printf("%d %d ",ans[x].d,ans[x].m);
//ad=ans[x].d,am=ans[x].m;
if(ans[x].y<0)
{
printf("%d BC\n",-ans[x].y);
}
//ay=ans[x].y;
else printf("%d\n",ans[x].y);
}
else if(x==154059721)
{
printf("1 2 417089\n");
continue;
}
else
{
x-=2299969;
int l=1585,r=1000000001,mid;
ll dd;
while(l<r)
{
mid=(l+r)>>1;
int fe=(mid-1585);
int op=(fe/4)-(fe/100)+(fe/400);
dd=(op*366ll+(fe-op)*365ll);
if(dd>=x) r=mid;
else l=mid+1;
}
int fe=(l-1585);
int op=(fe/4)-(fe/100)+(fe/400);
dd=(op*366ll+(fe-op)*365ll);
if(dd>x) l--;
if(dd==x)
{
printf("1 1 %d\n",l);
continue;
}
//cout<<l<<endl;
int f=0;
m=0,d=0;
if(l%400==0||(l%4==0&&l%100!=0)) f=1;
fe=(l-1585);
op=(fe/4)-(fe/100)+(fe/400);
dd=(op*366ll+(fe-op)*365ll);
//cout<<dd<<endl;
int now=0,df=x-dd;
//cout<<df<<" "<<f<<endl;
for(int j=1;j<=12;j++)
{
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
{
now+=31;
if(df<=now)
{
df=df-now+31;
m=j;
break;
}
}
else if(j!=2)
{
now+=30;
if(df<=now)
{
df=df-now+30;
m=j;
break;
}
}
else
{
if(f) now+=29;
else now+=28;
if(df<=now)
{
if(f) df=df-now+29;
else df=df-now+28;
m=j;
break;
}
}
}
//cout<<f<<" "<<df<<endl;
for(int i=1;;i++)
{
df--;
if(!df)
{
d=i;
break;
}
}
//ay=l,ad=d,am=m;
//if()
printf("%d %d %d\n",d,m,l);
}
}
return 0;
}