求助
查看原帖
求助
147895
破壁人罗辑楼主2021/10/20 17:49

推公式的做法,我也不知道哪里公式推错了

#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;
}
2021/10/20 17:49
加载中...