题解 | 2023 年牛客多校第三场 H 题 Until the Blue Moon Rises
Until the Blue Moon Rises
https://ac.nowcoder.com/acm/contest/57357/H
题意:给定一个长度为 的序列 ,一次操作可以选择两个不同的数字 和 执行 。问能不能有限次操作内让序列中每个数字都是质数。,。
解法:当 时,显然和 为质数才行。
当 时,(每个数字都是最小的质数 )。
当 时,如果 为偶数,则由哥德巴赫猜想一定成立。如果 为奇数,则必然是 。检查 是否为质数即可。
当 时,可以首先先安排 个 ,问题退化到 的情形。当 为偶数时,哥德巴赫猜想使得一定有解。如果 是奇数,则可以让前面 个 中其中一个 变成 ,则此时 为偶数,如果 ,则同样利用哥德巴赫猜想可以证明成立。
#include <bits/stdc++.h>
using namespace std;
bool checkPrime(long long x)
{
if (x == 1)
return false;
for (int i = 2; 1ll * i * i <= x; i++)
if (x % i == 0)
return false;
return true;
}
int main()
{
long long sum = 0;
int n;
scanf("%d", &n);
for (int i = 1, x; i <= n; i++)
{
scanf("%d", &x);
sum += x;
}
if (n == 1)
{
if (checkPrime(sum))
puts("Yes");
else
puts("No");
return 0;
}
if (sum < 2 * n)
{
puts("No");
return 0;
}
long long res = sum - 2 * (n - 2);
if (res % 2 == 0 || checkPrime(res - 2))
{
puts("Yes");
return 0;
}
if (n > 2 && res - 1 >= 4)
puts("Yes");
else
puts("No");
return 0;
}