推公式的做法,我也不知道哪里公式推错了
#include<bits/stdc++.h>
using namespace std;
inline long long fk_read(){long long ret=0;char c=getchar();while(c>'9'||c<'0')c=getchar();while(c>='0'&&c<='9'){ret=ret*10+(c&15);c=getchar();}return ret;}
int main(){
int mp[366],dp[366],mr[367],dr[367],month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(register int i=1,m=1,d=1;i<366;i++){if(d>month[m]){d=1;m++;}mp[i]=m;dp[i]=d++;}
month[2]++;
for(register int i=1,m=1,d=1;i<367;i++){if(d>month[m]){d=1;m++;}mr[i]=m;dr[i]=d++;}
register int Q=fk_read();
while(Q--){
long long n=fk_read();
if(n<1721423){
long long yt=((n/1461)*4)+((n%1461)/365),t=n-(yt*365)-(yt/4),y=4713-yt;
if(yt%4)printf("%d %d %lld BC\n",dp[t],mp[t],y);
else printf("%d %d %lld BC\n",dr[t+1],mr[t+1],y);
}
else if(n==1721423)printf("31 12 1 BC\n");
else if(n<=2299160){
long long y=(((n-1721423)/1461)*4)+1+(((n-1721423)%1461)/365),t=n-1721423-(y/4)-(365*y)+365;
if(y%4)printf("%d %d %lld\n",dp[t],mp[t],y);
else printf("%d %d %lld\n",dr[t],mr[t],y);
}
else{
long long y=1582+(((n-2298874)/146097)*400)+((((n-2298874)%146097)/36524)*100)+(((((n-2298874)%146097)%36524)/1461)*4)+(((((n-2298874)%146097)%36524)%1461)/365);
long long t=n-2298874-(((n-2298874)/146097)*146097)-((((n-2298874)%146097)/36524)*36524)-(((((n-2298874)%146097)%36524)/1461)*1461)-((((((n-2298874)%146097)%36524)%1461)/365)*365);
if(y%4)printf("%d %d %lld\n",dp[t],mp[t],y);
else printf("%d %d %lld\n",dr[t],mr[t],y);
}
}
return 0;
}