题解 | 2023 年牛客多校第三场 H 题 Until the Blue Moon Rises

Until the Blue Moon Rises

https://ac.nowcoder.com/acm/contest/57357/H

题意:给定一个长度为 nn 的序列 {a}i=1n\{a\}_{i=1}^n,一次操作可以选择两个不同的数字 aia_iaja_j 执行 aiai+1,ajaj1a_i \leftarrow a_i+1,a_j \leftarrow a_j-1。问能不能有限次操作内让序列中每个数字都是质数。1n1031 \le n \le 10^31ai1091 \le a_i\le 10^9

解法:当 n=1n=1 时,显然和 ss 为质数才行。

n2n \ge 2 时,s2ns \ge 2n(每个数字都是最小的质数 22)。

n=2n=2 时,如果 ss 为偶数,则由哥德巴赫猜想一定成立。如果 ss 为奇数,则必然是 2+(n2)2+(n-2)。检查 n2n-2 是否为质数即可。

n3n \ge 3 时,可以首先先安排 n2n-222,问题退化到 n=2n=2 的情形。当 s2ns-2n 为偶数时,哥德巴赫猜想使得一定有解。如果 s2ns-2n 是奇数,则可以让前面 n2n-222 中其中一个 22 变成 33,则此时 s2n1s-2n-1 为偶数,如果 s2n14s-2n-1 \ge 4,则同样利用哥德巴赫猜想可以证明成立。

#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;
}
全部评论

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务