1 / 1 / 0
Регистрация: 12.03.2010
Сообщений: 36

Задача "Т-простые числа"

09.09.2025, 16:11. Показов 1669. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Известно, что простыми называются целые положительные числа, у которых ровно два различных положительных делителя. По аналогии назовем целое положительное число t Т-простым, если у t ровно три различных положительных делителя.

Вам дан массив, состоящий из n целых положительных чисел. Для каждого из них определите, является ли оно Т-простым или нет.

Входные данные
Первая строка содержит единственное целое число — количество чисел в массиве, n (1 ≤ n ≤ 10*5). Следующая строка содержит n целых чисел xi (1 ≤ xi ≤ 10*12), разделенных пробелами.

Выходные данные
Выведите n строк: i-тая строка должна содержать «YES» (без кавычек), если число xi является Т-простым, и «NO» (без кавычек), если не является.


При проверке задачи не влаживаюсь в ограничение по времени. Что ещё можно сделать?

Ссылка на саму задачу: codeforces.com/problemset/problem/230/B

Моё решение задачи:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from math import sqrt
a = int(input())
b = list(map(int, input().split()))
 
for i in range(a):
    c = sqrt(b[i])
    cc = int(sqrt(c)) + 1
    if c in [2, 3]:
        print('YES')
    elif b[i] == 1:
        print('NO')
    elif b[i] % 2 != 0:
        if b[i] % 3 != 0:
            if (c + 1) % 6 == 0 or (c - 1) % 6 == 0:
                for s in range(5, cc, 2):
                    if c % s == 0:
                        print('NO')
                        break
                else:
                    print('YES')
            else:
                print('NO')
        else:
            print('NO')
    else:
        print('NO')
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2025, 16:11
Ответы с готовыми решениями:

Найти все трехзначные простые числа. (Определить функцию, позволяющую распознавать простые числа.)
Найти все трехзначные простые числа. (Определить функцию, позволяющую распознавать простые...

Проверка чисел на простые и не простые
Добрый вечер) Помогите пожалуйста. Программа не сложная. Проверяет натуральные числа и определяет...

Задача: найти все простые числа в диапазоне
Вводятся два числа. Нужно найти все простые числа от A до B. Ограничение по времени - 1 секунда,...

16
 Аватар для Semen-Semenich
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,310
09.09.2025, 16:54
Цитата Сообщение от MiK_on Посмотреть сообщение
Что ещё можно сделать?
оптимизировать. убрать кучу условий, если делителей больше 3х то дальше не проверять

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def is_t_prime(n):   
    divisors_count = 0
    for i in range(1, int(n**0.5) + 1):
        if n % i == 0:
            if i * i == n: # Если делитель - корень, считаем один раз
                divisors_count += 1
            else: # Иначе считаем два делителя (i и n/i)
                divisors_count += 2
        if divisors_count > 3: 
            break
    return 'YES' if divisors_count == 3 else 'NO'
 
a = int(input()) # вроде как лишняя строка но можно использовать как индексы (ваш вариант)
for b in list(map(int, input().split())):
    print(is_t_prime(b))
1
1 / 1 / 0
Регистрация: 12.03.2010
Сообщений: 36
09.09.2025, 17:06  [ТС]
Ваш вариант тоже не прошёл по времени.

Я так понимаю больше всего времени тратится на прохождение цикла. Поэтому с помощью условий попытался свести к минимуму количество чисел попадающих в цикл. Но этого мало.
0
5522 / 2875 / 572
Регистрация: 07.11.2019
Сообщений: 4,771
09.09.2025, 17:51
Для начала сделайте проверку того, что число это квадрат.
Что-то типа такого:
Python
1
math.isqrt(x)**2==x

Затем проверку того, что квадратный корень из него - простое число.
2
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
10.09.2025, 21:48
Лучший ответ Сообщение было отмечено MiK_on как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n = 1000000
primes = [False] * 2 + [True] * (n - 1)
i = 2
while i * i <= n:
    if primes[i]:
        for j in range(i * i, n + 1, i):
            primes[j] = False
    i += 1
    
input()
for x in map(int, input().split()):
    sqrt_x = int(x ** 0.5)
    print('YES' if sqrt_x * sqrt_x == x and primes[sqrt_x] else 'NO')
1
130 / 126 / 19
Регистрация: 05.08.2021
Сообщений: 555
12.09.2025, 12:00
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import math
 
l = [int(input('Число ')) for i in range(int(input('Количество ')))]
res = []
 
def find_divisors(n):
    global res
    divisors = []
    for i in range(1, int(math.sqrt(n)) + 1):
        if not n % i:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    return divisors
 
for i in range(len(l)):
    res += [find_divisors(l[i])]
result = [l[i] for i in range(len(l)) if len(res[i]) == 3]
for i in l:
    if i in result:
        print('YES', i)
    else:
        print('NO', i)
1
130 / 126 / 19
Регистрация: 05.08.2021
Сообщений: 555
12.09.2025, 16:06
Результат
Изображения
 
0
130 / 126 / 19
Регистрация: 05.08.2021
Сообщений: 555
13.09.2025, 13:15
Если вот так то уже вовсе не 18 секунд, как прежде. Это было видимо из-за ручного ввода чисел. Их за две секунды руками не введешь.
Время выполнения программы: 0.004999637603759766 секунд
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import math
import time
 
start_time = time.time()
 
l = list(map(int,'6 9 8 7 25'.split(' ')))
res = []
 
def find_divisors(n):    
    divisors = []
    for i in range(1, int(math.sqrt(n)) + 1):
        if not n % i:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    return divisors
 
 
for i in range(len(l)):
    res += [find_divisors(l[i])]
result = [l[i] for i in range(len(l)) if len(res[i]) == 3]
for i in l:
    if i in result:
        print('YES', i)
    else:
        print('NO', i)
        
end_time = time.time() 
execution_time = end_time - start_time 
 
print(f"Время выполнения программы: {execution_time} секунд")
Ну или поменять строки местами
Python
1
2
l = list(map(int,input().split(' ')))
start_time = time.time()
Будет 0.007018566131591797 секунд
0
5522 / 2875 / 572
Регистрация: 07.11.2019
Сообщений: 4,771
13.09.2025, 15:57
Zloyalex100, серьезно? А ты попробуй для 100000 чисел посмотреть сколько времени считать будет твоя программа и числа возьми побольше.. до 10**12 в условии сказано.
0
130 / 126 / 19
Регистрация: 05.08.2021
Сообщений: 555
13.09.2025, 17:16
Не представляю как можно ввести в строку 100000 чисел

Добавлено через 28 минут
Цитата Сообщение от u235 Посмотреть сообщение
посмотреть сколько времени считать будет твоя программа
10000 чисел от 1 до 1000 считала 88.71056985855103 секунд. Полторы минуты. Долго, но по моим меркам не конец света для учебной задачи

Добавлено через 9 минут
Это при том что принты по любому работают долго. Если их убрать - получилось 0.0979917049407959 секунд
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.09.2025, 17:17
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Не представляю как можно ввести в строку 100000 чисел
Входит и выходит, замечательно выходит.
*Сгенерировать.
0
5522 / 2875 / 572
Регистрация: 07.11.2019
Сообщений: 4,771
13.09.2025, 18:32
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Долго, но по моим меркам не конец света для учебной задачи
Это непрохождение теста по ограничению времени. Незачет. О чем и говорит ТС.
Напомню: ограничение по времени на тест 2 секунды.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
13.09.2025, 19:12
Проще(быстрее) в начале найти квадраты всех простых чисел до 10**6
Затем проверить вхождение в это множество исходных чисел
У меня ~ 0.05сек для 100000 чисел до 10**12
3
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.09.2025, 04:25
Цитата Сообщение от Gdez Посмотреть сообщение
найти квадраты всех простых чисел до 10**6
Почему до 106, а не до 1012?
0
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1583
Регистрация: 06.09.2009
Сообщений: 27,133
14.09.2025, 10:05
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему до 106, а не до 1012?
Потому что (106)2 = 1012
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.09.2025, 12:47
Я думал квадраты до 106, а он имел ввиду найти простые числа до 106.
Могучий "русский", либо я не понял, либо кто то не верно его использовал.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
14.09.2025, 22:11
Чем не устраивает решение из 5го сообщения?
Данное решение принято сайтом и уложилось в требуемые ограничения по времени - 2 секунды.

Алгоритм:
1. Решетом Эратосфена определяем простые числа до 10**6 (до корня из максимально возможного введенного числа)
2. Циклом проверяем все числа. Если число является квадратом и корень из введенного числа - простое, выводим YES иначе NO
Миниатюры
Задача "Т-простые числа"  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2025, 22:11
Помогаю со студенческими работами здесь

Задача Эйлера № 7 Про простые числа
Условия задачи таковы Выписав первые шесть простых чисел, получим 2, 3, 5, 7, 11 и 13. Очевидно,...

Задача на простые числа
Пусть задан список целых чисел: . В этой последовательности восемь простых чисел...

Напишите программу, которая выводит все простые числа, меньшие данного натурального числа
Напишите программу, которая выводит все простые числа, меньшие данного натурального числа. ...

Найти взаимное простые числа в диапазоне первого заданного числа
я реализую алгоритм rsa, и для того чтобы вычислить открытый ключ мне необходимо найти взаимно...

Для заданного натурального числа n определить все простые числа меньшие n
Для заданного натурального числа n определить все простые числа меньшие n. Для решения задачи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru