求助50pts
查看原帖
求助50pts
390770
D2T1xubiaoshi楼主2021/8/2 21:54

和题解对拍没发现错误

//P7075
/*
365+365+365+366=1461
1600~1999天数:146097
1721424 1.1.1
2298884 1582.1.1
2299160 1582.10.4
2305448 1600.1.1
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;

const ll DayinM[13] = {0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
ll kd[146097],km[146097],ky[146097];
ll n;

bool isLeapYear(ll y){
//	if(y<1582) return (y%4 ? 0 : 1);
	return (y%400 ? (y%4 ? 0 : (y%100 ? 1 : 0)) : 1);
}
int getDaycnt(ll y,ll m){
	if(m != 2) return DayinM[m];
	return isLeapYear(y) ? 29 : 28;
}
int getMonthDay(ll diny, bool isly){
	ll Month, Day, sum = 0;
	for(int i = 1; i <= 12; ++ i){
		sum += getDaycnt(isly ? 4 : 3, i);
		if(diny < sum){
			Month = i;
			sum -= getDaycnt(isly ? 4 : 3, i);
			Day = diny - sum + 1;
			printf("%lld %lld ", Day, Month);
			return 0;
		}
	}
	return 0;
}
inline void bf(ll k){
	int Year = 1582, Month = 10, Day = 15;
	for(ll i = 2299162; i <= k; ++ i){
		int MonthEnd = getDaycnt(Year, Month);
		if(Day < MonthEnd) ++ Day;
		else {
			Day = 1;
			if(Month < 12) ++ Month;
			else Month = 1, ++ Year;
		}
//		if(Year == 1599 && Month == 12 && Day == 31){
//			printf("%lld %lld %lld %lld\n", i, Day, Month, Year);
//			return;
//		}
	}
	printf("%lld %lld %lld\n", Day, Month, Year);
	return;
}
void func(){
	int Year = 0, Month = 1, Day = 1;
	for(int i = 0; i < 146097; ++ i){
		ky[i] = Year, km[i] = Month, kd[i] = Day;
		int MonthEnd = getDaycnt(Year, Month);
//		if(Year%100==0 && Year%400!=0 && MonthEnd == 29) MonthEnd = 28;
		if(Day < MonthEnd) ++ Day;
		else {
			Day = 1;
			if(Month < 12) ++ Month;
			else Month = 1, ++ Year;
		}
	}
	return;
}

inline int solve(){
	scanf("%lld", &n);
	if(n <= 1721423){
		int k = n / 1461;
		n %= 1461;
		if(n < 366){
			getMonthDay(n, 1);
			printf("%lld BC\n", 4713 - k * 4 - 0);
		} else if(n < 366 + 365){
			getMonthDay(n - 366, 0);
			printf("%lld BC\n", 4713 - k * 4 - 1);
		} else if(n < 366 + 365 + 365){
			getMonthDay(n - 366 - 365, 0);
			printf("%lld BC\n", 4713 - k * 4 - 2);
		} else if(n < 366 + 365 + 365 + 365){
			getMonthDay(n - 366 - 365 - 365, 0);
			printf("%lld BC\n", 4713 - k * 4 - 3);
		}
	} else if(n <= 2299160){
		n -= 1721424;
		ll k = n / 1461;
		n %= 1461;
		if(n < 365){
			getMonthDay(n, 1);
			printf("%lld\n", k * 4 + 1);
		} else if(n < 365 + 365){
			getMonthDay(n - 365, 0);
			printf("%lld\n", k * 4 + 2);
		} else if(n < 365 + 365 + 365){
			getMonthDay(n - 365 - 365, 0);
			printf("%lld\n", k * 4 + 3);
		} else if(n < 365 + 365 + 365 + 366){
			getMonthDay(n - 365 - 365 - 365, 0);
			printf("%lld\n", k * 4 + 4);
		}
	} else if(n <= 2305447){
		bf(n);
	} else {
		n -= 2305448;
		int k = n / 146097;
		n %= 146097;
		printf("%lld %lld %lld\n", kd[n], km[n], ky[n] + 1600 + k * 400);
	}
	return 0;
}

signed main(){
//	freopen("julian3.in","r",stdin);
//	freopen("julian3.out","w",stdout);
	int Q;
	func();
	scanf("%lld", &Q);
	while(Q--) solve();
	return 0;
}
2021/8/2 21:54
加载中...