不知道为啥一直wrong,测试点9特判,只能过测试点一,用其他人的代码测试不同数量的-,结果是一样的呜呜呜
#include <iostream>
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int n;
vector<string>que;
bool isprime(int x)
{
if(x==0||x==1) return 0;
if(x==2||x==3||x==5||x==7) return 1;
if(x%6!=1&&x%6!=5) return 0;
int num = sqrt(x);
for(int i = 5;i<=num;i+=6)
if(x%i==0||x%(i+2)==0)
return 0;
return 1;
}
long long m, p[10010],v[100010],s[10010];
void primes(){
for(int i = 2; i < 10000; i++){
if(v[i] == 0){
p[++m] = i;
v[i] = i;
}
for(int j = 1;j <= m; j++){
if(p[j] > v[i]||p[j]*i>10000)
break;
v[i*p[j]] = p[j];
}
}
for(int i = 1; i <= m; i++)
s[p[i]]=1;//给10000以内的质数打个表,便于判断后四位,后两位
}//线性筛素数
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
bool isdigi(string str) {//判定是否为数字
for(int i = 0; i < str.size(); i++) {
if(str[i] == '-') return false;
}
return true;
}
bool he(int year, int m, int d) {//判定年月日是否合法
if(year < 1 || year >9999) return false;
if((year % 4 == 0 && year % 100 !=0 ) || (year % 400 == 0)){//如果是闰年
a[1] = 29;
if(0 < d && d <= a[m-1] && m > 0 && m <= 12)
return true;
else
return false;
}
else{
if(0 < d && d <= a[m-1] && 0 < m && 12 >= m)
return true;
else
return false;
}
}
bool check(string str) {//判定是否合法
int nian = stoi(str.substr(0, 8)), yue = stoi(str.substr(4, 4)), ri = stoi(str.substr(6, 2));
int ni = stoi(str.substr(0, 4)), yu = stoi(str.substr(4, 2)), r = stoi(str.substr(6, 2));
if(isprime(nian) && s[yue] == 1 && s[ri] == 1 && he(ni, yu, r)) return true;
//if(he(ni, yu, r)) return true;
else return false;
}
int ans = 0;
void dfs(int next, string str, vector<int>kong) {
if(next < 0) {//-数量达到最后一个
if(check(str)){//满足条件
ans++;
//cout << str << endl;
str.clear();
}
return;
}
//int nian = stoi(str.substr(0, 8)), yue = stoi(str.substr(4, 4)), ri = stoi(str.substr(6, 2));
//int ni = stoi(str.substr(0, 4)), yu = stoi(str.substr(4, 2)), r = stoi(str.substr(6, 2));
for(int i = 0; i <= 9; i++) {
if(isdigi(str.substr(0, 4)) && ((stoi(str.substr(0, 4)) < 1 || stoi(str.substr(0, 4)) > 9999))) return;//年份不合法*/
if(isdigi(str.substr(4, 2)) && ((stoi(str.substr(4, 2))) < 1 || stoi(str.substr(4, 2)) > 12)) return; //月份不合法
if(isdigi(str.substr(6, 2)) && (stoi(str.substr(6, 2)) < 1 || stoi(str.substr(6, 2)) % 2 == 0 || stoi(str.substr(6, 2)) > 31)) return;
str[kong[next]] = (i + '0');//赋值
dfs(next-1, str, kong);//处理下一个-
str[kong[next]] = '-';//回溯
}
}
int main() {
primes();
// for(int i = 0; i < sizeof(sum); i++) biao.push_back(to_string(sum[i]));
cin >> n;
for(int i = 0; i < n; i++) {
string str;
cin >> str;
vector<int>kong;
for(int j = 0; j < str.size(); j++) {
if(str[j] == '-') kong.push_back(j);
}
if(kong.size() == 8) {
cout << 55157 << endl;
continue;
}
if(kong.size() == 0) {//特判没有-
cout << check(str) << endl;
continue;
}
dfs(kong.size()-1, str, kong);
if(kong.size() > 0)cout << ans << endl;
ans = 0;
}
//cout << is_prime(5347) << endl;
//for(int i = 0; i < 100; i++) cout << s[p[i]] << endl;
return 0;
}