#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2310558+5;
ll q,r,now=0,mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct node{
ll d,m,y;
}pw[N];
void check(int x){
if(pw[x].y==1582&&pw[x].m==10&&pw[x].d==5) pw[x].d=15;
if(pw[x].d>=mon[pw[x].m]+1){
if(pw[x].m!=2){
pw[x].d=1;
pw[x].m=pw[x-1].m+1;
}else{
if((pw[x].y<0&&(pw[x].y+1)%4==0)||(pw[x].y>0&&pw[x].y%4==0)){
if(pw[x].d==30){
pw[x].d=1;
pw[x].m=pw[x-1].m+1;
}
}else{
pw[x].d=1;
pw[x].m=pw[x-1].m+1;
}
}
}
if(pw[x].m==13){
pw[x].m=1;
pw[x].y=pw[x-1].y+1;
if(pw[x].y==0) pw[x].y=1;
}
}
void pre_work(){
while(pw[now].y!=1600){
now++;
pw[now].d=pw[now-1].d+1;
pw[now].m=pw[now-1].m;
pw[now].y=pw[now-1].y;
check(now);
}
}
void wr(ll x){
cout<<pw[x].d<<" "<<pw[x].m<<" "<<abs(pw[x].y);
if(pw[x].y<0) cout<<" "<<"BC";
cout<<"\n";
}
void solve(ll r){
ll rid=r-now;
ll d400=365*400+97;
ll y400=rid/d400;
rid-=y400*d400;
ll d100=365*100+24;
ll y100=rid/d100;
rid-=y100*d100;
ll d4=365*4+1;
ll y4=rid/d4;
rid-=d4*y4;
ll d1=365;
ll y1=rid/d1;
rid-=y1*d1;
ll y=1600+y400*400+y100*100+y4*4+y1*1;
ll m=1;
while(rid-mon[m]>0){
if((y%400==0||(y%4==0&&y%100!=0))&&m==2) rid-=1;
rid-=mon[m];
m++;
if(m==13) m=1,y++;
}
if(m!=1){
if(rid-mon[m-1]==0) rid=1;
}else{
if(rid-mon[12]==0) rid=1;
}
cout<<rid<<" "<<m<<" "<<y<<"\n";
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
pw[0].d=1;
pw[0].m=1;
pw[0].y=-4713;
pre_work();
cin>>q;
while(q--){
cin>>r;
if(r<=now) wr(r);
else solve(r);
}
return 0;
}
大模拟写废了
思路:先暴力求1600年以前的,以后的再手动计算。严重怀疑后半部分出错。
感谢各位大侠鼎力相助!!!