0分求调
查看原帖
0分求调
357237
Unknown__楼主2024/5/18 21:34
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const long long m = 1e5 + 1;
bool book[10101011];
int pri[100011],n,T,cnt,pos[10];
int ans,tot;
int mo[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
string s;
void init()
{
	int i,j;
	for(i = 2;i <= m;i++)
	{
		if(!book[i]) pri[++cnt] = i;
		for(j = 1;1ll * i * pri[j] < m && j <= cnt;j++)
		{
			//cout<<j<<endl;
			//getchar();
			book[1ll * i * pri[j]] = 1;
			if(i % pri[j] == 0)break;
		}
	}
}
bool isrun(int n)
{
	if(n % 4 != 0) return 0;
    else if(n % 100 == 0)
	{
		if(n % 400 == 0) return 1;
		else return 0;
	}
	else return 1;
}
int work(string s1)
{
	int ret = 0,i,len = s1.length();
	for(i = 1;i < len;i++)
		ret = ret * 10 + s1[i] - '0';
	return ret;
}
bool check(int ch)
{
	if(ch == 0 || ch == 1)return false;
	for(int i = 1;i <= cnt && ch >= pri[i];i++)if(ch % pri[i] == 0 && ch != pri[i])return false;
	return true;
}
bool isans(string s1)
{
	s1 = '#' + s1;
	int i,j,year = (s1[1] - '0') * 1000 + (s1[2] - '0') * 100 + (s1[3] - '0') * 10 + (s1[4] - '0');
	int mon = (s1[5] - '0') * 10 + (s1[6] - '0'),day = (s1[7] - '0') * 10 + (s1[8] - '0'),isr = (int)isrun(year);
	//cout<<year<<' '<<mon<<' '<<day<<endl;
	//getchar();
	if(!year || !mon || !day)return false;
	if(mon > 12)return false;
	if(day > mo[mon] + isr)return false;
	int x = work(s1);
	if(check(x) && check(x % 100) && check(x % 10000))return true;
	else return false;
}
void dfs(int p,string now)
{
	if(p == 9)
	{
		cout<<now<<endl;
		//getchar();
		if(isans(now))
		{
			ans++;
		}
		return;
	}
	if(!pos[p])
	{
		now.push_back(s[p]);
		dfs(p + 1,now);
		now.pop_back();
	}
	else
	{
		int i;
		for(char c = '0';c <= '9';c++)
		{
			now.push_back(c);
			dfs(p + 1,now);
			now.pop_back();
		}
	}
}
int main()
{
	int i,j;
	cin>>T;
	init();
	while(T--)
	{
		s.clear();
		ans = 0;
		cin>>s;
		if(s == "--------")
		{
			cout<<55157<<endl;
			continue;
		}
		s = '#' + s;
		memset(pos,0,sizeof pos);
		for(i = 1;i < s.length();i++)
			if(s[i] == '-')pos[i] = 1;
		string ss;
		ss.clear();
		dfs(1,ss);
		cout<<ans<<endl;
	}
}

有时候会多统计一些,但不知道哪里写的不对/kk

2024/5/18 21:34
加载中...