40pts求助
查看原帖
40pts求助
344633
oneton429楼主2020/11/9 10:28

过了大样例,WA #5 #6 #7 #8 #9 #10

#include <cstdio>
#include <cctype>
#define int long long

template <class I> inline void read(I & x) {
	x = 0;
	int w = 1;
	char c = ' ';
	while (!isdigit(c) && c != '-') c = getchar();
	if (c == '-') c = getchar(), w *= -1;
	while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
	x *= w;
}

template<class I> inline void read(I & a, I & b) {read(a), read(b);}
template<class I> inline void read(I & a, I & b, I & c) {read(a, b), read(c);}

const int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int q;
unsigned long long r;

inline bool pd(int ye) {
	if (ye < 0)
		return ye % 4 == -1;
	else if (ye < 1582)
		return !(ye % 4);
	else 
		return (!(ye % 400)) || ((!(ye % 4)) && (ye % 100));
}

inline int getd(int ye) {
	return pd(ye) ? 366 : 365;
}

inline int getdd(int ye, int m) {
	return m == 2 ? (pd(ye) ? 29 : 28) : days[m];
}

signed main(void) {
//#ifndef DEBUG
	//freopen("julian.in", "r", stdin);
	//freopen("julian.out", "w", stdout);
//#endif
	read(q);
	while (q--) {
		read(r);
		if (r <= 365) { //subtask 1
			int mon = 1;
			++r;
			const int ddays[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
			while (r > ddays[mon])
				r -= ddays[mon],
				++mon;
			printf("%llu %lld %d BC\n", r, mon, 4713);
		} else if (r < 1721424) { //Before Century
			int y = -4713, m = 1;
			++r;
			y += (r - 1) / 1461 * 4,
			r = (r - 1) % 1461 + 1;
			while (r > getd(y))
				r -= getd(y),
				++y;
			while (r > getdd(y, m))
				r -= getdd(y, m),
				++m;
			printf("%llu %lld %lld BC\n", r, m, -y);
		} else if (r < 2299161) { //Before Gregorian(at 10, 4, 1582)
			r -= 1721424,
			++r;
			int y = 1, m = 1;
			y += (r - 1) / 1461 * 4,
			r = (r - 1) % 1461 + 1;
			while (r > getd(y))
				r -= getd(y),
				++y;
			while (r > getdd(y, m))
				r -= getdd(y, m),
				++m;
			printf("%llu %lld %lld\n", r, m, y);
		} else {
			r -= 2299161,
			++r;
			int y = 1582, m = 10;
			if (r <= 17) {
				printf("%llu %lld %lld", 14 + r, m, y);
				continue;
			}
			r -= 17, m = 11;
			if (r <= 30) {
				printf("%llu %lld %lld", r, m, y);
				continue;
			}
			r -= 30, m = 12;
			if (r <= 31) {
				printf("%llu %lld %lld", r, m, y);
				continue;
			}
			r -= 31, m = 1, y = 1583;
			y += (r - 1) / 146097 * 400,
			r = (r - 1) % 146097 + 1;
			while (r > getd(y))
				r -= getd(y),
				++y;
			while (r > getdd(y, m))
				r -= getdd(y, m),
				++m;
			printf("%llu %lld %lld\n", r, m, y);
		}
	}
	return 0;
}
2020/11/9 10:28
加载中...