0pts求调,样例能过,按理说起码有几个ac的点
查看原帖
0pts求调,样例能过,按理说起码有几个ac的点
1160571
MiKal6688楼主2024/11/6 21:12
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int know[10];
int month1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int month2[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int ans;
int cnt;
string s;
string st;

bool pri(int num){
	if(num<=1){
		return false;
	}
	for(int i=2;i*i<=num;i++){
		if(num%i==0){
			return false;
		}
	}
	return true;
}

bool ispri1(string t){
	int a;
	char ac[2];
	for(int i=6;i<8;i++)ac[i-6]=t[i];
	a=(ac[0]-'0')*10+(ac[1]-'0')*1;
	return pri(a);
}
bool ispri2(string t){
	int b;
	char bc[4];
	for(int i=4;i<8;i++)bc[i-4]=t[i];
	b=(bc[0]-'0')*1000+(bc[1]-'0')*100+(bc[2]-'0')*10+(bc[3]-'0')*1;
	return pri(b);
}
bool ispri3(string t){
	int c;
	char cc[8];
	for(int i=0;i<8;i++)cc[i]=t[i];
	c=(cc[0]-'0')*10000000+(cc[1]-'0')*1000000+(cc[2]-'0')*100000+(cc[3]-'0')*10000+(cc[4]-'0')*1000+(cc[5]-'0')*100+(cc[6]-'0')*10+(cc[7]-'0')*1;
	return pri(c);
}
bool ispri(string t){
	return (ispri1(t)&&ispri2(t)&&ispri3(t));
}
bool check(string t){
	int a,b,c;
	char ac[4],bc[2],cc[2];
	for(int i=0;i<4;i++)ac[i]=t[i];
	for(int i=4;i<6;i++)bc[i-4]=t[i];
	for(int i=6;i<8;i++)cc[i-6]=t[i];
	a=(ac[0]-'0')*1000+(ac[1]-'0')*100+(ac[2]-'0')*10+(ac[3]-'0')*1;
	b=(bc[0]-'0')*10+(bc[1]-'0')*1;
	c=(cc[0]-'0')*10+(cc[1]-'0')*1;
	if(a%4==0){
		return (a>=0&&a<=9999&&b>=0&&b<=12&&c>=0&&c<=month2[b-1]);
	}
	else{
		return (a>=0&&a<=9999&&b>=0&&b<=12&&c>=0&&c<=month1[b-1]);
	}
}

void dfs(int k){
	//cout<<ans<<endl;
	int now=know[k];
	if(now>=0){
		if(now<6){
			if(!ispri1(st))return;
		}
		if(now<4){
			if(!ispri2(st))return;
		}
	}
	if(k==0){
		if(ispri3(st)&&check(st))ans++;
		return;
	}
	for(int i=0;i<=9;i++){
		st[now]=char(i+'0');
		//cout<<st<<endl;
		dfs(k-1);
		st[now]='-';
	}
	return;
}

int main(){
	int T;
	cin>>T;
	while(T--){
		cin>>s;
		st=s;
		cnt=0;
		for(int i=0;i<s.length();i++){
			if(s[i]=='-'){
				know[++cnt]=i;
			}
		}
		//for(int i=0;i<cnt;i++)cout<<know[i]<<endl;
		ans=0;
		if(cnt!=0){
			dfs(cnt);
			cout<<ans<<endl;
		}
		else{
			if(ispri(s))
				cout<<1<<endl;
			else
				cout<<0<<endl;
		}
	}
	
	return 0;
}
2024/11/6 21:12
加载中...