许诺 • 1个月前
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> nums(N);
int max_num = 0;
for (int i = 0; i < N; ++i) {
cin >> nums[i];
if (nums[i] > max_num) {
max_num = nums[i];
}
}
vector<bool> is_prime(max_num + 1, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i <= max_num; ++i) {
if (is_prime[i]) {
for (int j = i * i; j <= max_num; j += i) {
is_prime[j] = false;
}
}
}
vector<int> primes;
for (int i = 2; i <= max_num; ++i) {
if (is_prime[i]) {
primes.push_back(i);
}
}
vector<bool> win(max_num + 1, false);
vector<int> steps(max_num + 1, 0);
for (int n = 1; n <= max_num; ++n) {
bool can_win = false;
int min_step = INT_MAX;
int max_step = -1;
for (int p : primes) {
if (p > n) break;
int rem = n - p;
if (rem < 0) continue;
if (!win[rem]) {
can_win = true;
int current_step = 1 + steps[rem];
if (current_step < min_step) {
min_step = current_step;
}
} else {
int current_step = 1 + steps[rem];
if (current_step > max_step) {
max_step = current_step;
}
}
}
if (can_win) {
win[n] = true;
steps[n] = min_step;
} else {
win[n] = false;
steps[n] = (max_step == -1) ? 0 : max_step;
}
}
for (int x : nums) {
if (win[x]) {
cout << steps[x] << endl;
} else {
cout << -1 << endl;
}
}
return 0;
}
评论:
请先登录,才能进行评论