0分过不了样例3求调
查看原帖
0分过不了样例3求调
784856
Comars楼主2023/9/29 12:22

rt.

#include<cstdio>
using namespace std;
#define int long long
int q,n,year,month,day;
int mx[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int check(int x){
	int days=(x+4712)*365;
	if(x<1582){
		days+=(x+4712)/4+1;
	}else{
		days-=10;
		days+=(1581+4712)/4+1;
		days+=(x-1580)/4-(x-1500)/100+(x-1200)/400;
	}
	return days;
}
void getnextday(int isleap){
	day++;
	if(year==1582&&month==10&&day==5) day=15;
	if(day>mx[isleap][month]) day=1,month++;
}
signed main(){
	scanf("%lld",&q);
	while(q--){
		scanf("%lld",&n);
		int l=-4712,r=1e9,ans;
		while(r-l>5){
			int mid=(l+r)>>1;
			if(check(mid)<=n) l=mid+1;
			else r=mid-1;
		}
		for(int i=r;i>=l;i--)
			if(check(i)<=n){
				ans=i;
				break;
			}
		n-=check(ans);
		year=ans;
		if(ans<=0) ans--;
		month=1,day=1;
		while(n--) getnextday((n<1582&&n%4==0)||(n>1582&&((n%4==0&&n%100!=0)||n%400==0)));
		if(ans==-4713) getnextday(0);
		if(ans<0) printf("%lld %lld %lld BC\n",day,month,-ans);
		else printf("%lld %lld %lld\n",day,month,ans);
	}
	return 0;
}
2023/9/29 12:22
加载中...