蒟蒻求助
查看原帖
蒟蒻求助
357641
YyuanDa楼主2020/11/30 21:17
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
//ifstream cin();
//ofstream cout();
//freopen("","r",stdin);
//freopen("","w",stdout);
int pow[9],dig[9],md[32];
int T,cnt,res;
int p[100];
string str;
void init(){
	ios::sync_with_stdio(false);
	cin>>T;
	pow[1]=1,pow[2]=10,pow[3]=100,pow[4]=1000,pow[5]=10000;
	pow[6]=1e5,pow[7]=1e6,pow[8]=1e7;
	p[2]=1,p[3]=1,p[5]=1,p[7]=1,p[11]=1,p[13]=1,p[17]=1,p[19]=1,p[23]=1,p[29]=1,p[31]=1;
	md[1]=31,md[2]=28,md[3]=31,md[4]=30,md[5]=31,md[6]=30,md[7]=31,md[8]=31,md[9]=30,md[10]=31,md[11]=30,md[12]=31;
}
bool isprime(int x){
	for(int i=2;i*i<=x;i++){
		if(x%i==0) return false;
	}
	return true;
}
void trynum(int num,int step);
void solve(){
	cnt=0,res=0;
	int num=0;
	memset(dig,0,sizeof(dig));
	for(int i=0;i<8;i++) if(str[i]=='-') {
		dig[++cnt]=i;
	}
	for(int i=0;i<=7;i++){
		num*=10;
		if(str[i]=='-') continue;
		num+=str[i]-'0';
	}
//	cout<<"FUCK   "<<num<<endl;
	trynum(num,cnt);
	printf("%d\n",res);
}
bool ok(int num){
	int year=num/10000,day=num%100,month=(num%10000)/100,f=0;
	if(month>12) return false;
	if(day<=0) return false;
	if(month<=0) return false;
	if((year%100!=0&&year%4==0)||(year%400==0)) f=1;
	if(f) md[2]++;
	if(day>md[month]){
		if(f) md[2]--;
		return false;
	}
	if(f) md[2]--;
	return true;
}
void trynum(int num,int step){
	if(!ok(num)) return;
	if(!p[num%100]) return;
	if(!isprime(num%10000)) return;
	if(step==0) {
		if(isprime(num)) {
		//	cout<<num<<" "<<isprime(num)<<" "<<isprime(num%10000)<<" "<<p[num%100]<<endl;
			res++;
		}
		return;
	}
	for(int i=0;i<=9;i++){
		trynum(num+i*pow[dig[step]],step-1);
	}
}
int main(){
	init();
	while(T--){
		cin>>str;
		solve();
	}
	return 0;
}
/*
53571307
53973307
*/
2020/11/30 21:17
加载中...