Captain Flint and Crew Recruitment

Captain Flint and Crew Recruitment
在这里插入图片描述

思路

题目大意: 如果一个整数 x x x可以被表示成两个质数 p p p q ( p ≠ q ) q(p≠q) q(p=q)的积,那我们可以把他叫做为近质数.

输入一个整数 n n n,请将它表示成四个不同的正整数的和,要求其中三个是近质数

我们先列出最小的近质数并寻早规律.

可以看到,最小的三个近质数分别为 2 ∗ 3 , 2 ∗ 5 , 2 ∗ 7 ( 6 , 10 , 14 ) 2*3,2*5,2*7 (6,10,14) 23,25,276,10,14)

那也就是说,小于 ( 6 + 10 + 14 + 1 = 31 ) (6+10+14+1 = 31) (6+10+14+1=31) n n n 无法被如此表示.

接下来我们考虑重复的情况. 当 n n n大于 ( 6 + 10 + 14 + 14 = 44 ) (6+10+14+14 = 44) (6+10+14+14=44)的时候,无需考虑重复问题.

那就只需要看看三个特例 ( 6 , 10 , 14 重 复 ) (6,10,14重复) (6,10,14)能不能被其他的方案排列.

3 ∗ 5 15 3*5 \quad15 3515也是近质数,因此我们很容易得到

6 10 14 6 6\quad 10\quad 14 \quad6 610146 的替代: 6 10 15 5 6\quad 10 \quad15\quad 5 610155

6 10 14 10 6\quad 10\quad 14\quad 10 6101410 的替代: 6 10 15 9 6\quad 10\quad 15\quad 9 610159

6 10 14 14 6\quad 10 \quad14\quad 14 6101414 的替代: 6 10 15 13 6\quad 10\quad 15 \quad13 6101513

对这三个特例做一个特判即可 时间复杂度为 O ( 1 ) O(1) O(1)

#include<bits/stdc++.h>

using namespace std;
int main() {
    
    
    int _;
    scanf("%d", &_);
    while (_--) {
    
    
        int n;
        scanf("%d", &n);
        // 6 10 14
        if (n <= 30) {
    
    
            puts("NO");
            continue;
        }
        puts("YES");
        if (n == 36) {
    
    
            printf("6 10 15 5\n");
            continue;
        }
        if (n == 40) {
    
    
            printf("6 10 15 9\n");
            continue;
        }
        if (n == 44) {
    
    
            printf("6 10 15 13\n");
            continue;
        }
        printf("6 10 14 %d\n", n - 30);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43601103/article/details/112801188