萌新求助
查看原帖
萌新求助
220367
gaygoo楼主2020/11/27 08:19

传送门

#include<bits/stdc++.h>
using namespace std;
bool isprime[10038];
int t, pt[10000], m[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, key = 1;
string s;
void prime_table(){//1~10035间的质数
	for(int i = 2; i <= 10035; i++)isprime[i] = 1;
	for(int i = 2; i <= 101; i++){
		if(isprime[i]){
			for(int j = i * 2; j <= 10035; j += i){
				isprime[j] = 0;
			}
		}
	}
	for(int i = 2; i <= 10035; i++)
		if(isprime[i]){
			pt[key++] = i;
		}	
}
bool isprimee(int p){
	for(int i = 1; i <= sqrt(p); i++){
		if(p % pt[i])	return false;
	}
	return true;
}
bool isok(int dat){
	if((dat / 100) % 100 > 12)				return false;
	if(dat % 100 > m[(dat / 100) % 100])	return false;
	if(!(((dat / 10000) % 400 == 0 || ((dat / 10000) % 100 != 0  && (dat / 10000) % 4 == 0 ))))
		if((dat / 100) % 100 == 2 && dat % 100 >= 29)	return false;
	return true;
}
int l[9], tmp[9], pos[9];
int dfs(string a){
	int ans = 0;
	memset(l, 0, sizeof(l));
	for(int i = 1; i <= 8; i++)	tmp[i] = 0;
	int cnt = 0, k = 1;
	for(int i = 0; i < 8; i++){
		if(a[i] == '-'){
			l[i + 1] = -1;
			++cnt;
			pos[k++] = i + 1;
		}
		else{
			l[i + 1] = a[i] - '0';
		}
	}
	if(cnt == 0){
		int dat = l[1] * 10000000 + l[2] * 1000000 + l[3] * 100000 + l[4] * 10000 + l[5] * 1000 + l[6] * 100 + l[7] * 10 + l[8] * 1;
		return (isok(dat) && isprimee(dat));
	}
	while(1){
		if(tmp[1] >= 10)
			break;
		for(int i = cnt; i > 1; i--){
			if(tmp[i] >= 10){
				tmp[i] -= 10;
				tmp[i - 1] ++;
			}
			else	break;
		}
		for(int i = 1; i <= cnt; i++){
			l[pos[i]] = tmp[i];
		}
		int dat = l[1] * 10000000 + l[2] * 1000000 + l[3] * 100000 + l[4] * 10000 + l[5] * 1000 + l[6] * 100 + l[7] * 10 + l[8] * 1;
		if(isok(dat))
			if(isprimee(dat))
				ans++;
		tmp[cnt]++;
	}
	return ans;
}
int main(){
	prime_table();
	cin >> t;
	for(int i = 1; i <= t; i++){
		cin >> s;
		cout << dfs(s) << endl;
	}
	return 0;
}
2020/11/27 08:19
加载中...