Коля по-прежнему
пытается пройти тест по теории чисел. Лектор настолько доведен до отчаяния
знаниями Коли, что она дает ему каждый раз одну и ту же задачу.
В задаче следует
проверить, делится ли n! на n2.
Вход. Одно число n (1
≤ n ≤ 109).
Выход. Вывести “YES”, если n! делится на n2. Иначе вывести “NO”.
Пример
входа |
Пример
выхода |
3 |
NO |
тест на
простоту
Анализ алгоритма
Поскольку n! = 1 * 2 * … * n, то n! делится на n. Если n простое, то произведение n!
/ n
= 1 * 2 * … * (n – 1) не
делится на n. Следовательно при
простом n значение n! не делится на n2.
Если n не простое, то его можно представить в
виде произведения двух чисел (не обязательно простых): например n = a * b. Тогда n! = (a * b)! содержит множители a, b,
a * b и n! делится на n2.
Отдельно
рассмотрим два случая:
·
при n = 1 (не простое и не
составное) значение n! делится на n2;
·
при n = 4 (составное)
значение n! не делится на n2.
Пример
Если n = 5 (простое), то 5! = 1 * 2 * 3 * 4 * 5 не делится на 52.
Если n = 15 (составное), то 15! в своем разложении содержит множители 3, 5 и 15, и
следовательно делится на 152.
Если n = 4 (составное), то 4! = 1 * 2 * 3* 4 делится на 4, но не делится на 42.
Реализация алгоритма
Функция IsPrime
проверяет, является ли число n простым.
Если n простое, то функция возвращает
1. Иначе функция возвращает 0.
int IsPrime(int
n)
{
for(int i = 2; i <= sqrt(1.0*n); i++)
if (n % i
== 0) return 0;
return 1;
}
Основная часть программы. Читаем входное значение n.
scanf("%d",&n);
Выводим ответ в зависимости от значения n.
if (n == 4) puts("NO"); else
if (n == 1 || !IsPrime(n)) puts("YES");
else
puts("NO");
Java реализация
import java.util.*;
public class Main
{
public static boolean
IsPrime(int n)
{
for(int i = 2; i <=
Math.sqrt(n); i++)
if (n % i == 0) return false;
return true;
}
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
if (n == 4)
System.out.println("NO"); else
if (n == 1
|| !IsPrime(n)) System.out.println("YES");
else
System.out.println("NO");
con.close();
}
}
Python реализация
import math
def IsPrime(n):
for i in range(2, int(math.sqrt(n))+1):
if n % i
== 0: return False
return True
n = int(input())
if n == 4:
print("NO")
elif n == 1 or not IsPrime(n):
print("YES")
else:
print("NO");