7075,RT
#include<iostream>
#include<cmath>
using namespace std;
#define int long long
const int N=6500000;
const int M=146500;
const int M2=146097;
int n,y[N+10],m[N+10],d[N+10],y2[M],m2[M],d2[M];
int dy[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int k){
if(k<0){
if((k+100005)%4==0) return true;
else return false;
}
else{
if(k<1582){
if(k%4==0) return true;
else return false;
}
if((k%4==0&&k%100!=0)||k%400==0) return true;
else return false;
}
}
bool check2(int k){
if(k%4==0&&k%100!=0) return true;
if(k%100==0&&k%400!=0) return false;
if(k%400==0) return true;
return false;
}
signed main(){
int x,tmp,yy=-4713,mm=1,dd=1;
cin>>n;
for(int i=1;i<=N;++i){
dy[2]=28;
if(check(yy)) dy[2]++;
if(yy==1582&&mm==10&&dd==4){
dd=15;
y[i]=yy;
m[i]=mm;
d[i]=dd;
continue;
}
if(dd==dy[mm]){
if(mm==12){
if(yy==-1) yy=1;
else ++yy;
mm=dd=1;
}
else{
++mm;
dd=1;
}
}
else{
++dd;
}
y[i]=yy;
m[i]=mm;
d[i]=dd;
}
yy=1;
mm=1;
dd=1;
for(int i=1;i<=146400;++i){
dy[2]=28;
if(check2(yy)) dy[2]++;
if(dd==dy[mm]){
if(mm==12){
if(yy==-1) yy=1;
else ++yy;
mm=dd=1;
}
else{
++mm;
dd=1;
}
}
else{
++dd;
}
y2[i]=yy;
m2[i]=mm;
d2[i]=dd;
}
while(n--){
cin>>x;
if(x==0){
cout<<"1 1 4713 BC"<<endl;
continue;
}
if(x<=N){
cout<<d[x]<<" "<<m[x]<<" "<<abs(y[x]);
if(y[x]<0) cout<<" BC";
cout<<endl;
}
else{
x-=2451911;
tmp=y2[x%M2]+(x/M2)*400+2000;
cout<<d2[x%M2]<<" "<<m2[x%M2]<<" "<<tmp<<endl;
}
}
return 0;
}
主要思路:公元后2000年前,特判处理; 公元后2000年后,以400年为一周期打表。
结果90分,WA了最后一个点。。求助