RT
考场上调了3h,过了大样例
#include<bits/stdc++.h>
#define ll long long
#define P 365
#define R 366
#define M 1721424
#define Year1582 577825
#define Lost 12
using namespace std;
namespace IO{
#define iL (1<<20)
char ibuf[iL],*iS=ibuf+iL,*iT=ibuf+iL;
#define gc() ((iS==iT)?(iT=(iS=ibuf)+fread(ibuf,1,iL,stdin),(iS==iT)?EOF:*iS++):*iS++)
template<class T>inline void read(T &x){
register char c;register bool f;
for(c=gc(),f=false;!isdigit(c);f|=c=='-',c=gc());
for(x=0;isdigit(c);x=(x<<1)+(x<<3)+(c^48),c=gc());
if(f)x=~x+1;
return ;
}
char Out[iL],*iter=Out;
#define flush() fwrite(Out,1,iter-Out,stdout),iter=Out
template<class T>inline void write(T x){
register T c[35],l;
if(x<0)*iter++='-',x=~x+1;
for(l=0;!l || x;c[l]=x%10,++l,x/=10);
for(;l;--l,*iter++=c[l]+'0');
flush();
return ;
}
}
using namespace IO;
//const ll day[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const ll dayP[15]={0,31,59,90,120,151,181,212,243,273,304,334,365};
const ll dayR[15]={0,31,60,91,121,152,182,213,244,274,305,335,366};
//const ll day1582[15]={0,31,28,31,30,31,30,31,31,30,21,30,31};
const ll dayT[15]={0,31,59,90,120,151,181,212,243,273,294,324,355};
inline bool CheckR(ll x){
if(x<1582){
if(!(x%4)){
return true;
}
return false;
}
if(!(x%400) || (!(x%4) && x%100)){
return true;
}
return false;
}
inline ll CalcBC(ll mid){
if(mid>4713){
return 0;
}
ll k=(4713ll-mid)/4ll+1ll;
return (4714ll-mid-k)*P+k*R;
}
inline ll Calc(ll mid){
if(mid<1582){
ll k=mid/4ll;
return (mid-k)*P+k*R;
}
ll k=mid/4ll-mid/100ll+mid/400ll+Lost;
return (mid-k)*P+k*R;
}
int T;
ll n;
int main(){
freopen("julian.in","r",stdin),freopen("julian.out","w",stdout);
read(T);
for(register int _=0;_<T;++_){
read(n);
if(n<=M+1){
ll l=1ll,r=4714ll;
while(l+1<r){
ll mid=l+r>>1;
if(CalcBC(mid)>n){
l=mid;
}
else{
r=mid;
}
}
n-=CalcBC(l+1);
if(!n){
printf("1 1 "),write(l),printf(" BC\n");
}
else if((l-1)%4){
for(register int i=1;i<13;++i){
if(n+1<=dayP[i]){
write(n-dayP[i-1]+1),putchar(' '),write(i),putchar(' '),write(l),printf(" BC\n");
break;
}
}
}
else{
for(register int i=1;i<13;++i){
if(n+1<=dayR[i]){
write(n-dayR[i-1]+1),putchar(' '),write(i),putchar(' '),write(l),printf(" BC\n");
break;
}
}
}
}
else{
n-=M;
if(n<=Year1582){
ll l=0ll,r=1581ll;
while(l+1<r){
ll mid=l+r>>1;
if(Calc(mid)<=n){
l=mid;
}
else{
r=mid;
}
}
n-=Calc(l);
if(!n){
printf("1 1 "),write(r),putchar('\n');
}
else if(!CheckR(r)){
for(register int i=1;i<13;++i){
if(n+1<=dayP[i]){
write(n-dayP[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
break;
}
}
}
else{
for(register int i=1;i<13;++i){
if(n+1<=dayR[i]){
write(n-dayR[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
break;
}
}
}
}
else{
if(n<=Year1582+dayT[12]){
for(register int i=1;i<13;++i){
if(n<=Year1582+dayT[i]){
if(i==2){
int x=n-dayT[i-1];
if(x<=4){
write(x),printf(" 2 1582\n");
}
else{
write(x+10),printf(" 2 1582\n");
}
}
else{
write(n-dayT[i-1]),putchar(' '),write(i),printf(" 1582\n");
}
break;
}
}
}
else{
n=n+10;
ll l=1583ll,r=100000001ll;
while(l+1<r){
ll mid=l+r>>1;
if(Calc(mid)<=n){
l=mid;
}
else{
r=mid;
}
}
n-=Calc(l);
if(!n){
printf("1 1 "),write(r),putchar('\n');
}
else if(!CheckR(r)){
for(register int i=1;i<13;++i){
if(n+1<=dayP[i]){
write(n-dayP[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
break;
}
}
}
else{
for(register int i=1;i<13;++i){
if(n+1<=dayR[i]){
write(n-dayR[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
break;
}
}
}
}
}
}
}
return 0;
}