Дано целое
положительное число n. Сколько
решений в целых положительных числах имеет уравнение:
Вход. Целое число n
(1 ≤ n ≤ 109).
Выход. Количество
решений данного уравнения в натуральных числах.
Пример
входа |
Пример
выхода |
2 |
3 |
математика
Уравнение эквивалентно , ,
Количество пар
решений (x, y) равно количеству представления числа n2 в виде произведения двух множителей. Оно в свою
очередь равно количеству делителей числа n2.
Если n = , то количество его делителей равно
d(n) = (a1 + 1) * (a2
+ 1) * … * (ak + 1)
Ответом на
задачу будет значение d(n2)
= (2a1 + 1) * (2a2 + 1) * … * (2ak + 1).
Пример
Для n = 2 имеем: d(22) = 2 * 1 + 1 = 3.
Пусть n = 12. Поскольку 12 = 22 * 3
, то
d(122) = (2 * 2 + 1)
* (2 * 1 + 1) = 5 * 3 = 15
Число 122, например,
можно разложить на множители как 4 * 36. Решим ситему уравнений:
,
Одно из решений
исходного уравнения: .
Читаем входные
данные. Инициализируем текущий ответ задачи res единицей.
scanf("%d",&n); res = 1;
Для каждого простого делителя i числа n подсчитываем степень c,
с которой он входит в n. Умножаем
результат res на 2 * c + 1.
for(i = 2; i <= sqrt(n); i++)
{
c = 0;
while (n % i == 0)
{
n /= i; c++;
}
res = res * (2 * c
+ 1);
}
Если n > 1 по окончанию цикла, то оно равно простому делителю
исходного числа n. Этот делитель
входит в n со степенью 1,
следовательно res необходимо умножить
на 2 * 1 + 1 = 3.
if (n > 1) res *= 3;
Выводим результат.
printf("%d\n",res);
Java реализация
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int res = 1, n = con.nextInt();
for(int i = 2; i <= Math.sqrt(n);
i++)
{
int c;
for(c = 0; n % i == 0; c++) n /= i;
res = res * (2 * c + 1);
}
if (n > 1) res *= 3;
System.out.println(res);
}
}
Python реализация
import math
n = int(input())
res = 1
for i in range(2, int(math.sqrt(n)) + 1):
c = 0;
while n % i == 0:
n = n // i
c += 1
res = res * (2 * c + 1)
if n > 1: res *= 3
print(res)