应该是某个地方错了,大部分数据都是对的,但是不知道哪个地方hack了,然后爆零了。。。
大佬们求解orz
#include<bits/stdc++.h>
#define gc ch=getchar()
#define pt puts("")
#define pc putchar(32)
#define ll long long
using namespace std;
template <class T>void read(T &s){
s=0;T f=1;char gc;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;gc;}
while(ch<='9'&&ch>='0'){s=s*10+ch-'0';gc;}
s*=f;
}
template <class T>void put(T s){
if(s<0) putchar('-'),s=-s;
if(s>9) put(s/10);
putchar(s%10+'0');
}
ll r,q;
ll M[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ll y,m,d,BC,DC;
int main(){
//freopen("julian.in","r",stdin);
//freopen("julian.out","w",stdout);
read(q);
while(q--){
read(r);
y=-4713,m=1,d=1,BC=0,DC=0;
if(r>=2299239) y=1583,r-=2299239,BC=1,DC=1;
else if(r>=2299161) y=1582,m=10,d=15,r-=2299161,BC=1,DC=1;
else if(r==2299160){put(4),pc,put(10),pc,put(1582),pt;continue;}
else if(r>=1721424) y=1,r-=1721424,BC=1;
else if(r>=1721058) y=-1,r-=1721058;
//year
int run=0;
if(!BC){
if(r>=1461) y+=(r/1461)*4,r%=1461;
if(r>=366) ++y,r-=366;
y+=r/365,r%=365;
if((y+1)%4==0) run=1;
}
else{
if(!DC){
if(r>=1461) y+=(r/1461)*4,r%=1461;
y+=r/365,r%=365;
if(y%4==0) run=1;
}
else if(y==1583){
if(r>=6209) y=1600,r-=6209;
y+=(r/146097)*400,r%=146097;
if(r<366){run=1;break;}
while(r>=365){
if((y%100!=0&&y%4==0)||(y%400==0)){
if(r<366){run=1;break;}
else r-=366,++y;
}
else{
if(r<365) break;
else r-=365,++y;
}
}
}
}
if((y%100!=0&&y%4==0)||(y%400==0)) run=1;
//month
if(y==1582){
if(r>=17){
m=11,d=1,r-=17;
if(r>=30) ++m,r-=30;
}
}
else{
for(int i=1;i<12;++i){
if(i==2){
if(run){
if(r>=29) r-=29,++m;
else break;
}
else{
if(r>=28) r-=28,++m;
else break;
}
}
else{
if(r>=M[i]) r-=M[i],++m;
else break;
}
}
}
//day
d+=r;
if(y<0) y=-y;
put(d),pc,put(m),pc,put(y),pc;
if(!BC) printf("BC");
pt;
}
return 0;
}