社区讨论

T8TLE求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m34m5e30
此快照首次捕获于
2024/11/05 23:37
去年
此快照最后确认于
2025/11/04 15:15
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
//#pragma GCC optimize(3,"Ofast","inline")
#define int long long
using namespace std;
int sum;
string s;
int year[15],month[15],day[15];
vector<int> year1,month1,day1;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool ok(int x)
{
	if(x%100!=0&&x%4==0||x%400==0)
	{
		return 1;
	}
	return 0;
}
bool check1(int x)
{
	if(x<2)
	{
		return 1;
	}
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0)
		{
			return 1;
		}
	}
	return 0;
}
bool check()
{
	int y=year[1]*1000+year[2]*100+year[3]*10+year[4];
	int m=month[1]*10+month[2];
	int d=day[1]*10+day[2];
	if(y<1)
	{
		return 0;
	}
	if(d<1||d>31)
	{
		return 0;
	}
	if(m<1||m>12)
	{
		return 0;
	}
	if(m!=2)
	{
		if(d>a[m])
		{
			return 0;
		}
	}
	else
	{
		if(ok(y))
		{
			if(d>29)
			{
				return 0;
			}
		}
		else
		{
			if(d>28)
			{
				return 0;
			}
		}
	}
	if(check1(d)||check1(m*100+d)||check1(y*10000+m*100+d))
	{
		return 0;
	}
	return 1;
}
void dfs3(int step)
{
	if(step==day1.size())
	{
		if(check())
		{
			sum++;
		}
		return;
	}
	if(day1[step]==1)
	{
		for(int i=0;i<=3;i++)
		{
			day[day1[step]]=i;
			dfs3(step+1);
			day[day1[step]]=-1;
		}
	}
	else
	{
		for(int i=0;i<=9;i++)
		{
			day[day1[step]]=i;
			dfs3(step+1);
			day[day1[step]]=-1;
		}
	}
}
void dfs2(int step)
{
	if(step==month1.size())
	{
		dfs3(0);
		return;
	}
	if(month1[step]==2)
	{
		for(int i=0;i<=9;i++)
		{
			month[month1[step]]=i;
			dfs2(step+1);
			month[month1[step]]=-1;
		}
	}
	else
	{
		for(int i=0;i<=1;i++)
		{
			month[month1[step]]=i;
			dfs2(step+1);
			month[month1[step]]=-1;
		}
	}
}
void dfs1(int step)
{
	if(step==year1.size())
	{
		dfs2(0);
		return;
	}
	for(int i=0;i<=9;i++)
	{
		year[year1[step]]=i;
		dfs1(step+1);
		year[year1[step]]=-1;
	}
}
signed main()
{
//	freopen("prime.in","r",stdin);
//	freopen("prime.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		sum=0;
		year1.clear();
		month1.clear();
		day1.clear();
		memset(year,0,sizeof(year));
		memset(month,0,sizeof(month));
		memset(day,0,sizeof(day));
		cin>>s;
		if(s=="--------")
		{
			cout<<"55157\n";
			continue;
		}
		for(int i=0;i<4;i++)
		{
			if(s[i]=='-')
			{
				year[i+1]=-1;
				year1.push_back(i+1);
			}
			else
			{
				year[i+1]=s[i]-'0';
			}
		}
		for(int i=4;i<6;i++)
		{
			if(s[i]=='-')
			{
				month[i+1-4]=-1;
				month1.push_back(i+1-4);
			}
			else
			{
				month[i+1-4]=s[i]-'0';
			}
		}
		for(int i=6;i<8;i++)
		{
			if(s[i]=='-')
			{
				day[i+1-6]=-1;
				day1.push_back(i+1-6);
			}
			else
			{
				day[i+1-6]=s[i]-'0';
			}
		}
		dfs1(0);
		cout<<sum<<"\n";
	}
	return 0;
}
/*
*/

回复

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

正在加载回复...