求助 爆零了
查看原帖
求助 爆零了
697879
nantinggale_3楼主2022/5/3 06:55
#include <bits/stdc++.h>

int T;
char nums[10][8];
char tmp[8];
std::vector<int> primes;
int check[10005];
int month_days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int chars_to_num(char* strs, int len) {
    int res = 0;
    for (int i = 0; i < len; i++) {
        res *= 10;
        res += (strs[i] - '0');
    }
    return res;
}

bool test_prime_number(int num) {
    if (num < 2) return false;
    for (int i = 0; i < primes.size() && primes[i] < num; i++) {
        if (num % primes[i] == 0) {
            return false;
        }
    }
    return true;
}

bool test_leap_year(int year) {
    if (year % 4 == 0 && year % 100 != 0) {
        return true;
    } else if (year % 400 == 0 && year % 3200 != 0) {
        return true;
    }
    return false;
}

int dfs(int idx, char* tmp, char* num) {
    if (idx == 5) { // 日
        int days = chars_to_num(tmp + 6, 2);
        if (days <= 0 || days > 31 || !test_prime_number(days)) return 0;
    } else if (idx == 3) { // 月
        int days = chars_to_num(tmp + 6, 2);
        int month = chars_to_num(tmp + 4, 2);
        if (days <= 0 || days > month_days[month]) return 0;
        if (month <= 0 || month > 12 || !test_prime_number(month * 100 + days)) return 0;
    } else if (idx == -1) { // 年
        int days = chars_to_num(tmp + 6, 2);
        int month = chars_to_num(tmp + 4, 2);
        int year = chars_to_num(tmp, 4);
        if (year <= 0 || year > 10000 || !test_prime_number(year * 10000 + month * 100 + days)) return 0;
        if (test_leap_year(year) && month == 2) {
            if (days <= 0 || days > 29) return 0;
        } else {
            if (days <= 0 || days > month_days[month]) return 0;
        }
        if (month <= 0 || month > 12) return 0;
        // printf("%d:%d:%d\n", year, month, days);
        return 1;
    }
    if (num[idx] == '-') {
        int cnt = 0;
        for (int i = 0; i <= 9; i++) {
            tmp[idx] = '0' + i;
            cnt += dfs(idx - 1, tmp, num);
        }
        return cnt;
    } else {
        return dfs(idx - 1, tmp, num);
    }
}

char get() {
	char ch= getchar();
	while((ch < '0' || ch > '9') && ch != '-') ch= getchar();
	return ch;
}

int main() {
    memset(check, 0, sizeof(check));
    for (int i = 2; i < 10005; i++) {
        if (!check[i]) {
            primes.push_back(i);
        }
        for (int j = 0; j < primes.size() && primes[j] * i < 10005; j++) {
            check[primes[j] * i] = 1;
            if (i % primes[j] == 0) break;
        }
    }

    std::cin >> T;
    for (int t = 0; t < T; t++) {
        for (int i = 0; i < 8; i++) nums[t][i] = get();
        memcpy(tmp, nums[t], sizeof(tmp));
        printf("%d\n", dfs(7, tmp, nums[t]));
    }

    return 0;
}
2022/5/3 06:55
加载中...