社区讨论

0pts求调.exe

P5440【XR-2】奇迹参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m00w5p6t
此快照首次捕获于
2024/08/19 19:07
2 年前
此快照最后确认于
2025/11/04 23:02
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
string s;
bool pd(int x) {
	for (int i = 2; i <= x / i; i++)
		if (x % i == 0) return false;
	return true;
}
int res;
int n;
int num[10];
bool check(int y, int m, int d) {
	if (1 <= y && y <= 9999) {
		if (1 <= m && m <= 12) {
			if (d >= 1) {
				if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) return d <= 31;
				else if (m == 2) {
					if (y % 100 == 0) {
						if (y % 400 == 0) {
							return d <= 29;
						} else {
							return d <= 28;
						}
					} else {
						if (y % 4 == 0) {
							return d <= 29;
						} else {
							return d <= 28;
						}
					}
				} else return d <= 30;
			} else {
				return false;
			}
		} else {
			return false;
		}
	} else {
		return false;
	}
}
void dbg() {
	cout << "-----\n";
	for (int i = 1; i <= 8; i++) {
		cout << num[i] << " ";
	}
	cout << "-----\n";
}
void dfs(int idx) {
	if (idx > n) {
		int y, m, d;
		y = m = d = 0;
		for (int i = 1; i <= 8; i++)
			if (1 <= i && i <= 4) y = y * 10 + num[i];
			else if (5 <= i && i <= 6) m = m * 10 + num[i];
			else d = d * 10 + num[i];
		int i1 = d;
		int i2 = m * 100 + d;
		int i3 = y * 10000 + m * 100 + d;
		if (check(y, m, d) && pd(i1) && pd(i2) && pd(i3))
			res++;
		return;
	}
	if (s[idx] != '-') dfs(idx + 1);
	else {
		for (int i = 0; i <= 9; i++) {
			num[idx] = i;
			dfs(idx + 1);
			num[idx] = -1;
		}
	}
}
int main() {
	int t;
	cin >> t;
	while (t--) {
		cin >> s;
		n = s.size();
		s = ' ' + s;
		for (int i = 1; i <= n; i++)
			if (s[i] != '-') num[i] = s[i] - '0';
		res = 0;
		dfs(1);
		cout << res << endl;
	}
	return 0;
}

WA on #1~#7
TLE on #9 4.2s
WA+TLE on #8,#10

求调.exe

回复

1 条回复,欢迎继续交流。

正在加载回复...