WA求助
查看原帖
WA求助
1295409
akahoshi楼主2024/6/23 14:47
#include <bits/stdc++.h>

#define isLeap1(y) (y % 4 == 0)
#define yDay1(y) ((isLeap1(y)) ? 366 : 365)

#define isLeap2(y) (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
#define yDay2(y) ((isLeap2(y)) ? 366 : 365)

struct Date{
	bool isBc;
	unsigned long long y, m, d;
};

inline unsigned short queryDay(bool isLeap, unsigned short m){
	const unsigned short mDay[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	const unsigned short mDayLeap[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	return isLeap ? mDayLeap[m - 1] : mDay[m - 1];
}

Date query(unsigned long long r){
	unsigned long long y = 0, m = 0, d = 0;
	unsigned long long julianCalander4Years = (365 * 4) + 1;
	unsigned long long gregorianCalander400Years = (365 * 400) + 97;

	// 1 1 4713 BC -> 1 1 1 AD
	// 1179 Leap Years
	unsigned long long leap = ((4713 - 1) / 4) + 1; // 1179
	unsigned long long elapse = 4713 * 365 + leap; // 1721423
	if (r >= elapse){
		r -= elapse;
	}
	else {
		m = d = 1;
		while (r > 0){
			if (r < queryDay(isLeap1(y), m)){ // r + 1 <= queryDay
				d += r; r = 0;
			}
			else if (r < yDay1(y)){
				r -= queryDay(isLeap1(y), m); m++;
			}
			else if (r < julianCalander4Years){
				r -= yDay1(y); y++;
			}
			else {
				unsigned long long count = r / julianCalander4Years;
				r -= count * julianCalander4Years;
				y += count * 4;
			}
		}
		return {true, 4713 - y, m, d};
	}

	// 1 1 1 AD -> 4 10 1582 AD
	// 395 Leap Years
	leap = 1582 / 4; // 395
	elapse = (1582 * 365) + 287 + leap; // 578112
	if (r > elapse){
		r -= elapse;
	}
	else if (r == elapse){
		return {false, 1582, 10, 4};
	}
	else {
		y = m = d = 1;
		while (r > 0){
			if (r < queryDay(isLeap1(y), m)){
				d += r; r = 0;
			}
			else if (r < yDay1(y)){
				r -= queryDay(isLeap1(y), m); m++;
			}
			else if (r < julianCalander4Years){
				r -= yDay1(y); y++;
			}
			else {
				unsigned long long count = r / julianCalander4Years;
				r -= count * julianCalander4Years;
				y += count * 4;
			}
		}
		return {false, y, m, d};
	}
	
	// 15 10 1582 AD -> +inf
	r--;
	y = 1582; m = 10; d = 15;
	if ( r >= 78 ){
		r -= 78;
		y++;
		m = d = 1;
	}
	else if ( r >= 17 ){
		r -= 17;
		m++;
		d = 1;
	}
	while (r > 0){
		if (r < queryDay(isLeap2(y), m)){
			d += r; r = 0;
		}
		else if (r < yDay2(y)){
			r -= queryDay(isLeap2(y), m); m++;
		}
		else if (r < gregorianCalander400Years){
			r -= yDay2(y); y++;
		}
		else {
			unsigned long long count = r / gregorianCalander400Years;
			r -= count * gregorianCalander400Years;
			y += count * 400;
		}
	}
	return {false, y, m, d};
}

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	unsigned q;
	std::cin >> q;
	while (q--){
		unsigned long long r;
		std::cin >> r;
		Date d = query(r);
		std::cout << d.d << " " << d.m << " " << d.y << (d.isBc ? " BC" : "") << std::endl;
	}
	return 0;
}

似乎在15821015之后稳定差一年+11天,虽然我没看出来哪里出问题了

2024/6/23 14:47
加载中...