50分求调!!!必关!!!看着很长但只是有点小问题!!
  • 板块题目总版
  • 楼主lylin123
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/4 22:04
  • 上次更新2024/9/5 13:52:20
查看原帖
50分求调!!!必关!!!看着很长但只是有点小问题!!
1377407
lylin123楼主2024/9/4 22:04

题目入口:https://www.luogu.com.cn/problem/P7075

#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
int Q, y, m, d;

int mon[13] = {29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
ull ans, q;

/*
4713/1/1 BC ~ 1/12/31 1721423d
1/1/1 ~ 1582/10/4   1721424~22995160d
1582/10/15 ~ 1582/12/31 2299161~2299238d
1583/1/1 ~ 1599/12/31 2299239~2305447d
1600/1/1 ~ ∞          2305448d+
*/

void f1() { //4713/1/1 BC ~ 1/12/31
	y -= q / 1461 * 4;
	q %= 1461;
	if (q >= 366) {
		q -= 366;
		y--;
		y -= q / 365;
		q %= 365;
		for (int i = 1; i <= 12; i++) {
			if (q >= mon[i]) {
				q -= mon[i];
				m++;
			} else {
				break;
			}
		}
	} else {
		for (int i = 1; i <= 12; i++) {
			int j = i;
			if (i == 2) {
				j = 0;
			}
			if (q >= mon[j]) {
				q -= mon[j];
				m++;
			} else {
				break;
			}
		}
	}
	d += q;
	cout << d << ' ' << m << ' ' << y << ' ' << "BC" << endl;
	return;
}

void f2() {  //1/1/1 ~ 1582/10/4
	y += q / 1461 * 4;
	q %= 1461;
	bool run = 0;
	for (int i = 1; i <= 4; i++) {
		if (i == 4) {
			run = 1;
			if (q >= 366) {
				q -= 366;
				y++;
			} else {
				break;
			}
		} else {
			if (q >= 365) {
				q -= 365;
				y++;
			} else {
				break;
			}
		}
	}
	for (int i = 1; i <= 12; i++) {
		int j = i;
		if (run && j == 2) {
			j = 0;
		}
		if (q >= mon[j]) {
			q -= mon[j];
			m++;
		}
	}
	d += q;
	cout << d << ' ' << m << ' ' << y << endl;
	return;
}

void f3() {  //1582/10/15 ~ 1582/12/31
	for (int i = 10; i <= 12; i++) {
		if (q >= mon[i]) {
			q -= mon[i];
			m++;
		} else {
			break;
		}
	}
	d += q;
	cout << d << ' ' << m << ' ' << y << endl;
	return;
}

void f4() { //1583/1/1 ~ 1599/12/31
	bool run = 1;
	for (int i = 1583; i <= 1599; i++) {
		if (i % 4 == 0) {
			if (q >= 366) {
				q -= 366;
				y++;
			} else {
				break;
			}
		} else {
			if (q >= 365) {
				q -= 365;
				y++;
			} else {
				run = 0;
				break;
			}
		}
	}
	for (int i = 1; i <= 12; i++) {
		int j = i;
		if (i == 2 && run) {
			j = 0;
		}
		if (q >= mon[j]) {
			q -= mon[j];
			m++;
		} else {
			break;
		}
	}
	d += q;
	cout << d << ' ' << m << ' ' << y << endl;
	return;
}

void f5() { //1600/1/1 ~ ∞
	y += q / 146097 * 400;
	q %= 146097;
	bool run;
	for (int i = 0; i <= 399; i++) {
		run = (i == 0);
		if (i % 4 == 0 && i % 100 != 0) {
			run = 1;
		}
		if (run) {
			if (q >= 366) {
				q -= 366;
				y++;
			} else {
				break;
			}
		} else {
			if (q >= 365) {
				q -= 365;
				y++;
			} else {
				break;
			}
		}
	}
	for (int i = 1; i <= 12; i++) {
		int j = i;
		if (i == 2 && run) {
			j = 0;
		}
		if (q >= mon[j]) {
			q -= mon[j];
			m++;
		} else {
			break;
		}
	}
	d += q;
	cout << d << ' ' << m << ' ' << y << endl;
	return;
}

int main() {
	cin >> Q;
	for (int i = 1; i <= Q; i++) {
		cin >> q;
		if (q <= 1721423) {
			y = 4713, m = 1, d = 1;
			f1();
		} else if (q <= 2299160) {
			y = 1, m = 1, d = 1;
			q -= 1721424;
			f2();
		} else if (q <= 2299238) {
			y = 1582, m = 10, d = 14;
			q -= 2299161;
			f3();
		} else if (q <= 2305447) {
			y = 1583, m = 1, d = 1;
			q -= 2299239;
			f4();
		} else {
			y = 1600, m = 1, d = 1;
			q -= 2305448;
			f5();
		}
	}
	return 0;
}
2024/9/4 22:04
加载中...