第一种(本来抱有很大期望,结果https://luogu.com.cn/record/183496384):
#include <bits/stdc++.h>
#define int long long
using namespace std;
int num1=366,num2=365*3+366,num3=(1580/4)*(365*3+366),num4=num2*100-3;
int q,r;
int month[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int y=-4713,m=1,d=1;
void mon(int x){
while(x!=0){
while(x>=num2){
y+=4;
x-=num2;
if(y>1583 and y%100==0 and y%400!=0) x++;
}
if(y>1583 and y%100==0 and y%400!=0 and x==num2-1) y+=4,x=0;
while(x>=num1){
if((y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) or (y<0 and abs(y)%4!=1) or (y>0 and y<=1582 and y%4!=0)) x-=365;
else x-=366;
y++;
}
if(x==365 and (y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) or (y<0 and abs(y)%4!=1) or (y>0 and y<=1582 and y%4!=0)) y++,x=0;
if(m==2 and x>=28){
bool f=0;
if(y<0 and abs(y)%4!=1) m++,x-=28,f=1;
else if(y>0 and y<=1582 and y%4!=0) m++,x-=28,f=1;
else if(y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) m++,x-=28,f=1;
if(f) continue;
}
while(x>=month[m]) printf("%d %d %d\n",d,m,y),x-=month[m],m++;
d+=x;
break;
}
}
signed main(){
cin>>q;
while(q--){
y=-4713,m=1,d=1;
scanf("%d",&r);
if(r>=num1){
r-=num1;
y+=1;
if(r>=(4712/4)*num2){
r-=(4712/4)*num2;
y+=4713;
if(r>=num3){
r-=num3;
y+=1580;
if(r>=365){
r-=365;
y+=1;
if(r>=355){
y++;
r-=355;
if(r>=365*2){
y+=2;
r-=365*2;
if(r>=num2*4){
y+=16;
r-=num2*4;
if(r>=num4){
int cnt=r/num4;
y+=400*cnt;
r-=num4*cnt;
mon(r);
}else mon(r);
}
}else mon(r);
}else{
mon(r);
d+=10;
if(d>=month[m]) d-=month[m],m++;
}
}else mon(r);
}else mon(r);
}else mon(r);
}else{
mon(r);
}
printf("%d %d %d ",d,m,abs(y));
if(y<0) printf("BC");
printf("\n");
}
return 0;
}
第二种(不知为何re):
#include <bits/stdc++.h>
#define int long long
using namespace std;
int q,r;
int month[13]={0,31,32,31,30,31,30,31,31,30,31,30,31};
int y=-4713,m=1,d=1;
signed main(){
cin>>q;
while(q!=0){
y=-4713,m=1,d=1;
scanf("%d",&r);
while(r!=0){
while(r>=366){
if(y==1582){
y++,r-=355;
continue;
}
if(y<0 and abs(y)%4==1) y++,r-=366;
if(y>0 and y<1582 and y%4==0) y++,r-=366;
if(y>=1583 and ((y%4==0 and y%100!=0) or y%400==0)) y++,r-=366;
if(y<0 and abs(y)%4!=1) y++,r-=365;
if(y>0 and y<=1582 and y%4!=0) y++,r-=365;
if(y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) y++,r-=365;
if(y==0) y++;
}
while(r>=31){
if(m!=2){
m++;
r-=month[m-1];
}else{
if(y<0 and abs(y)%4==1) m++,r-=29;
if(y>0 and y<=1582 and y%4==0) m++,r-=29;
if(y>=1583 and ((y%4==0 and y%100!=0) or y%400==0)) m++,r-=29;
if(y<0 and abs(y)%4!=1) m++,r-=28;
if(y>0 and y<=1582 and y%4!=0) m++,r-=28;
if(y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) m++,r-=28;
}
}
d++;
r--;
// r--;
// d++;
// if(y==1582 and m==10 and d>=5 and d<=14){
// r++;
// continue;
// }
// if(d>month[m]){
// m++;
// d=1;
// }
}
printf("%d %d %d ",d,m,abs(y));
if(y<0) printf("BC");
printf("\n");
q--;
}
return 0;
}