10分但样例已过
查看原帖
10分但样例已过
137145
dogggggge楼主2024/9/20 14:04
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 10000
using namespace std;

int ans;
int year, month, day;
int dateNum;
int day_per_month[13] = {0, 31, 28, 31, 30,
                         31, 30, 31, 31,
                         30, 31, 30, 31
                        };

int date[10];
bool vis[N];
int pr[N];
int num;

void prime_get(void)
{
	vis[1] = 1;

	for (int i = 2; i <= N; i++)
	{
		if (vis[i] == 0)
		{
			pr[++num] = i;

			for (int j = i; j <= N; j += i)
				vis[j] = 1;
		}
	}
}

bool legal_date(int y, int m, int d)
{
	if (y == 0 || m > 12)
		return 0;

	if (m == 0 || d == 0)
		return 0;

	if (m == 2)
	{
		if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)//是闰年
		{
			if (d > 29)
				return 0;
		}
		else
			if (d > 28)
				return 0;
	}
	else
		if (d > day_per_month[m])
			return 0;

	return 1;
}

void get_ymd(void)
{
	year = dateNum / 10000;
	month = dateNum % 10000 / 100;
	day = dateNum % 100;
}

bool judge_prime(int y, int m, int d)
{
	int k = 0;

	for (int i = 2; i <= num; i++)
	{
		if (pr[i] == m * 100 + d)
			k++;

		if (pr[i] == d)
			k++;
	}

	for (int i = 2; i <= num; i++)
	{
		if (dateNum % pr[i] == 0)
			return 0;
	}

	if (k != 2)
		return 0;

}

void dfs(int step)
{

	if (step > 8)
	{
		get_ymd();

		if (legal_date(year, month, day) && judge_prime(year, month, day))
		{
			//	printf("%d,%d,%d\n", year, month, day);
			ans++;
		}

		return;
	}

	if (date[step] != -1)
	{
		dateNum = dateNum * 10 + date[step];
		dfs(step + 1);
		dateNum /= 10;
		return;
	}

	for (int i = 0; i <= 9; i++)
	{
		dateNum = dateNum * 10 + i;
		date[step] = i;
		dfs(step + 1);
		dateNum /= 10;
		date[step] = -1;
	}
}

int main()
{
	char s[10];
	prime_get();
	int t;
	cin >> t;

	while (t--)
	{
		int acount = 0;

		for (int i = 1; i <= 8; i++)
			cin >> s[i];

		for (int i = 1; i <= 8; i++) // 转换成数字
		{
			if (s[i] == '-')
			{
				date[i] = -1;
				acount++;
			}
			else
				date[i] = s[i] - '0';
		}

		if (acount == 8)
		{
			cout << "55157" << endl;
			continue;
		}

		dfs(1);
		cout << ans << endl;
		ans = 0;
	}
}

已经过了样例,特判之前也试过--------,能输出55157

2024/9/20 14:04
加载中...