TLE求调,有参考题解成分
查看原帖
TLE求调,有参考题解成分
932978
Twinkling楼主2023/10/4 12:11

参考题解:Here.

#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int Mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int n,y = -4737,m = 1,d = 1;
int isRun(int y){
	if(y <= 0){
		y = -y;
		return y % 4 == 1;
	}
	if(y <= 1582)
		return y % 4 == 0;
	return (y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0));
}
void GetNxtDay(){
	d++;
	if(y == 1582 && m == 10 && d == 5)
		d = 15;
	if((d > Mon[m]) + (m == 2 && isRun(y)))
		m++,d = 1;
	if(m > 12)
		y++,m = 1;
	return;
}
int ChkDay(int x){
	int day = 1ll * (x + 4712) * 365;
	if(x > 1582)
		day -= 10;
	day += 1ll * (x + 4712 + 3) / 4;
	if(x >= 1600){
		x -= 1601;
		day -= (ll)x / 100ll;
		day += (ll)x / 400ll;
	}
	return day;
	
}
signed main(){
	int Q;
	scanf("%d",&Q);
	while(Q--){
		y = 0,m = 1,d = 1;
		scanf("%d",&n);
		int lft = -4712;
		int rgt = 1e9+1;
		while(lft <= rgt){
			int mid = (lft + rgt) / 2;
			if(ChkDay(mid) <= n){
				y = mid;
				lft = mid + 1;
			}
			else
				rgt = mid - 1;
		}
		n -= ChkDay(y);
		if(y <= 0)
			y--;
		while(n--)
			GetNxtDay();
		printf("%d %d ",d,m);
		if(y <= 0)
			printf("%d BC\n",-y);
		else
			printf("%d\n",y);
	}
	return 0;
}

2023/10/4 12:11
加载中...