Как найти число если известно количество делителей

gray621

36 / 51 / 11

Регистрация: 14.01.2021

Сообщений: 406

1

Найти число по количеству делителей

17.01.2021, 19:52. Показов 9341. Ответов 14

Метки python 3, питон (Все метки)


Студворк — интернет-сервис помощи студентам

Формат ввода
Вводится натуральное число – количество делителей, считая единицу и само число.

Формат вывода
Вывести наименьшее число с таким количеством делителей.

Пример 1
Ввод Вывод
8
24
Пример 2
Ввод Вывод
48
2520
Примечания
При решении нельзя использовать функции и методы, а также списки и словари.

Вот код, чтобы найти кол-во делителей числа, а как наоборот?

Python
1
2
3
4
5
6
7
8
9
10
n = int(input())
count_of_dividers = 0
 
for i in range(n - 1, 1, -1):
 
    if n % i == 0:
 
        count_of_dividers += 1
 
print(count_of_dividers)



0



unfindable_404

Эксперт Python

690 / 473 / 204

Регистрация: 22.03.2020

Сообщений: 1,052

17.01.2021, 20:32

2

На основе вашего кода:

Python
1
2
3
4
5
6
7
8
9
10
11
divs = int(input())
n = 1
while True:
    count_of_dividers = 0
    for i in range(n, 0, -1):
        if n % i == 0:
            count_of_dividers += 1
    if count_of_dividers == divs:
        print(n)
        break
    n += 1



1



Эксперт Python

7256 / 4045 / 1780

Регистрация: 27.03.2020

Сообщений: 6,870

17.01.2021, 20:42

3

gray621, подсказка – количество делителей :
https://www.cyberforum.ru/cgi-bin/latex.cgi?prod_{}^{}({{p}_{i}}^{} + 1)
Где https://www.cyberforum.ru/cgi-bin/latex.cgi?{p}_{i} – степень простого i-го множителя в составе исходного числа
24 -> 2*2*2*3 -> https://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{3} * {3}^{1}
Итого множителей = (3+1) * (1+1) = 8



1



gray621

36 / 51 / 11

Регистрация: 14.01.2021

Сообщений: 406

17.01.2021, 20:52

 [ТС]

4

Цитата
Сообщение от unfindable_404
Посмотреть сообщение

divs = int(input())
n = 1
while True:
    count_of_dividers = 0
    for i in range(n, 0, -1):
        if n % i == 0:
            count_of_dividers += 1
    if count_of_dividers == divs:
        print(n)
        break
    n += 1

Спасибо, у меня не получалось придумать ещё n, а так всё такое же.

Добавлено через 5 минут

Python
1
2
3
4
5
6
7
8
9
10
11
divs = int(input())
n = 1
while True:
    count_of_dividers = 0
    for i in range(n, 0, -1):
        if n % i == 0:
            count_of_dividers += 1
    if count_of_dividers == divs:
        print(n)
        break
    n += 1

Код не работает на 18 тесте, превышен лимит времени, можно как-то ускорить цикл?



0



Эксперт Python

7256 / 4045 / 1780

Регистрация: 27.03.2020

Сообщений: 6,870

17.01.2021, 21:06

5

gray621, ограничения на “n” есть ?



0



36 / 51 / 11

Регистрация: 14.01.2021

Сообщений: 406

17.01.2021, 21:23

 [ТС]

6

Цитата
Сообщение от Gdez
Посмотреть сообщение

ограничения на “n” есть ?

Нет, но есть ограничение на время 1 секунда, а тест идёт 1064 ms, то есть нужно ускорить цикл немножко.

Добавлено через 15 минут
Я думаю можно уменьшить время пополам если уменьшить в range number пополам, т.к. делителей больше половины числа нет. Как это реализовать если в range int?



0



3483 / 2090 / 560

Регистрация: 02.09.2015

Сообщений: 5,335

17.01.2021, 21:35

7

Нарыл решение

Но оно не удовлетворяет условию:

Цитата
Сообщение от gray621
Посмотреть сообщение

При решении нельзя использовать функции и методы, а также списки и словари.

В т. ч. мемоизация.



0



Gdez

Эксперт Python

7256 / 4045 / 1780

Регистрация: 27.03.2020

Сообщений: 6,870

17.01.2021, 22:08

8

Лучший ответ Сообщение было отмечено gray621 как решение

Решение

gray621, если не ошибся

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
divs = int(input())
if divs % 2 :
    n = 1
    while True:
        if int(n**0.5) == n**0.5 :
            count_of_dividers = 1
            for i in range(1, int(n**0.5)):
                if n % i == 0:
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 1
else :
    n = divs
    while True:
        if int(n**0.5) != n**0.5 :
            count_of_dividers = 0
            for i in range(1, int(n**0.5) + 1) :
                if n % i == 0 :
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 2

Добавлено через 7 минут
Arsegg, на кодфорсе как то набрел на задачку по делителям. Вроде решил – тесты все прошла. Но позже сам нашел при каких N неверно считает мой код. Там через плюсики с реккурсией решили.
Если интересует, то возможно найду задачу на кодфорс. А тут я выкладывал тему :
Разложение на множители



1



Arsegg

17.01.2021, 22:34

Не по теме:

Цитата
Сообщение от Gdez
Посмотреть сообщение

Если интересует, то возможно найду задачу на кодфорс.

Полагаю, задача div1. 😀



0



gray621

36 / 51 / 11

Регистрация: 14.01.2021

Сообщений: 406

17.01.2021, 22:49

 [ТС]

10

Цитата
Сообщение от Gdez
Посмотреть сообщение

divs = int(input())
if divs % 2 :
    n = 1
    while True:
        if int(n**0.5) == n**0.5 :
            count_of_dividers = 1
            for i in range(1, int(n**0.5)):
                if n % i == 0:
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 1
else :
    n = divs
    while True:
        if int(n**0.5) != n**0.5 :
            count_of_dividers = 0
            for i in range(1, int(n**0.5) + 1) :
                if n % i == 0 :
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 2

А почему там n в корень возводится, а не пополам делится?

Добавлено через 5 минут
Зачем проверка

Python
1
if int(number ** 0.5) == number ** 0.5

?



0



Эксперт Python

7256 / 4045 / 1780

Регистрация: 27.03.2020

Сообщений: 6,870

17.01.2021, 23:11

11

Arsegg,

Добавлено через 5 минут
gray621,

А почему там n в корень возводится, а не пополам делится?

Потому что это не слагаемые, а делители. Допустим для 40 не нужно искать делители больше 6, сразу считать парами – 1 и 40, 2 и 20, 4 и 10, 5 и 8; всего 8 делителей.
Первый while перебирает квадраты чисел – у них нечетное число делителей.
Поэтому и проверка (это ответ на второй вопрос) – если число не квадрат другого числа, то количество делителей четное

Добавлено через 5 минут
gray621, Кроме 1, остальные минимальные числа с заданным количеством делителей – четные. Поэтому, если N > 1, то счетчик можно с шагом 2 по четным числам



2



36 / 51 / 11

Регистрация: 14.01.2021

Сообщений: 406

17.01.2021, 23:25

 [ТС]

12

Цитата
Сообщение от Gdez
Посмотреть сообщение

если число не квадрат другого числа, то количество делителей четное

То есть у квадратов чисел корни натуральные числа?



0



Эксперт Python

7256 / 4045 / 1780

Регистрация: 27.03.2020

Сообщений: 6,870

17.01.2021, 23:41

13

gray621, нет
4 -> 1, 2, 4
9 -> 1, 3, 9
16 -> 1, 2, 4, 8 16
и тд
Допустим 36 -> (1 и 36) + (2 и 18) + (3 и 12) + (4 и 9) + (6 и 6)… Но 6 и 6 это одно число. Итого четыре пары делителей плюс один делитель (для 36 это 6). Это для всех чисел, которые квадраты какого то натурального делителя.

Добавлено через 2 минуты
А вообще, задача без функций и списков некорректна. Когда найдешь код, который пройдет все тесты, попробуй число, допустим, 59 или 77



0



gray621

36 / 51 / 11

Регистрация: 14.01.2021

Сообщений: 406

18.01.2021, 00:14

 [ТС]

14

Цитата
Сообщение от Gdez
Посмотреть сообщение

Когда найдешь код, который пройдет все тесты

Твой код прошёл

Добавлено через 15 секунд

Цитата
Сообщение от Gdez
Посмотреть сообщение

Когда найдешь код, который пройдет все тесты

Твой код прошёл

Добавлено через 10 секунд

Цитата
Сообщение от Gdez
Посмотреть сообщение

Когда найдешь код, который пройдет все тесты

Твой код прошёл

Добавлено через 22 минуты
Зачем проверка для чётного кол-во делителей

Python
1
if int(number ** 0.5) != number ** 0.5:

И ещё почему в range + 1?

Python
1
range(1, int(number ** 0.5) + 1):



0



Gdez

Эксперт Python

7256 / 4045 / 1780

Регистрация: 27.03.2020

Сообщений: 6,870

18.01.2021, 04:38

15

gray621,

Зачем проверка для чётного кол-во делителей

Потому что для четных диапазон :

Python
1
range(1, int(number ** 0.5) + 1):

Для нечетных изначально можно не включать значение корня (для 36 число 6 уже входит -> count_of_dividers = 1)
Для четных нужно включать => допустим 42 -> его “целый” корень = 6 и для 6 парный делитель 7.
Если убрать проверку (что число не квадрат другого числа), то для N = 10 выведет ответ -> 36 -> посчитает пару (6 и 6)



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

18.01.2021, 04:38

Помогаю со студенческими работами здесь

Дано число P, нужно найти число от 1 до Р, с наибольшим количеством делителей
написал проггу, что не правильно уже 3 часа бьюсь…

int p;
int max=0,a = 0;

Дано натуральное число N. Найти число от 1 до N с максимальной суммою делителей
Дано натуральное число N. Найти число от 1 до N с максимальной суммой делителей.

Формат входных…

Дано натуральное число n. Найти число от 1 до n, имеющий как можно большее сумму делителей
Дано натуральное число n. Найти число от 1 до n, имеющий как можно большее сумму делителей.
Решать…

. Найти число всех натуральных делителей числа , которые не превосходят это число и взаимно простых с ним: а) 720, б) 3179, в) 6615
. Найти число всех натуральных делителей числа , которые не превосходят это число и взаимно…

Перестановка элементов массива по количеству делителей
Задание такое: Заполните массив случайными числами в интервале (100,999) и переставьте их по…

Расставьте данный массив натуральных чисел по количеству их делителей
Расставьте данный массив натуральных чисел по количеству их делителей.

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

Или воспользуйтесь поиском по форуму:

15

The given problem involves finding a number X that has all the integers in a given array as its divisors except for 1 and X itself. The array contains N integers that are all divisors of X, and the goal is to find X. If there is no such number, the function should return -1.

To solve this problem, we can use the fact that the product of all the integers in the array will give us X^2. Since we know that each integer in the array is a divisor of X, we can take the square root of X^2 to get X. Therefore, we can multiply all the integers in the array to get X^2, take the square root of X^2 to get X, and then check if all the integers in the array are divisors of X. If they are, we return X, otherwise, we return -1.

To implement this algorithm, we can first sort the array to make sure that the smallest and largest integers are multiplied to get X^2. We can then compute X by taking the square root of the product of all the integers in the array. Finally, we can check if all the integers in the array are divisors of X by iterating through the array and checking if X is divisible by each integer. If X is divisible by all integers in the array, we return X. Otherwise, we return -1.

Examples: 

Input: arr[] = {2, 10, 5, 4} 
Output: 20 

Input: arr[] = {2, 10, 5} 
Output: 20 

Input: arr[] = {2, 15} 
Output: -1 

Approach: Sort the given N divisors and the number X will be the first number * last number in the sorted array. Cross-check if the X contradicts the given statement or not by storing all the divisors of X except 1 and X in another array and if the formed array and given array are not same then print -1, else print X.

Below is the implementation of the above approach: 

C++

#include <bits/stdc++.h>

using namespace std;

int findX(int a[], int n)

{

    sort(a, a + n);

    int x = a[0] * a[n - 1];

    vector<int> vec;

    for (int i = 2; i * i <= x; i++)

    {

        if (x % i == 0)

        {

            vec.push_back(i);

            if ((x / i) != i)

                vec.push_back(x / i);

        }

    }

    sort(vec.begin(), vec.end());

    if (vec.size() != n)

        return -1;

    else

    {

        int i = 0;

        for (auto it : vec)

        {

            if (a[i++] != it)

                return -1;

        }

    }

    return x;

}

int main()

{

    int a[] = { 2, 5, 4, 10 };

    int n = sizeof(a) / sizeof(a[0]);

    cout << findX(a, n);

    return 0;

}

Java

import java.util.*;

class GFG {

    static int findX(int a[], int n)

    {

        Arrays.sort(a);

        int x = a[0] * a[n - 1];

        Vector<Integer> vec = new Vector<Integer>();

        for (int i = 2; i * i <= x; i++)

        {

            if (x % i == 0)

            {

                vec.add(i);

                if ((x / i) != i)

                    vec.add(x / i);

            }

        }

        Collections.sort(vec);

        if (vec.size() != n)

            return -1;

        else {

            int i = 0;

            for (int it : vec) {

                if (a[i++] != it)

                    return -1;

            }

        }

        return x;

    }

    public static void main(String[] args)

    {

        int a[] = { 2, 5, 4, 10 };

        int n = a.length;

        System.out.print(findX(a, n));

    }

}

Python3

import math

def findX(list, int):

    list.sort()

    x = list[0]*list[int-1]

    vec = []

    i = 2

    while(i * i <= x):

        if(x % i == 0):

            vec.append(i)

            if ((x//i) != i):

                vec.append(x//i)

        i += 1

    vec.sort()

    if(len(vec) != int):

        return -1

    else:

        j = 0

        for it in range(int):

            if(a[j] != vec[it]):

                return -1

            else:

                j += 1

    return x

a = [2, 5, 4, 10]

n = len(a)

print(findX(a, n))

C#

using System;

using System.Collections.Generic;

class GFG {

    static int findX(int[] a, int n)

    {

        Array.Sort(a);

        int x = a[0] * a[n - 1];

        List<int> vec = new List<int>();

        for (int i = 2; i * i <= x; i++)

        {

            if (x % i == 0) {

                vec.Add(i);

                if ((x / i) != i)

                    vec.Add(x / i);

            }

        }

        vec.Sort();

        if (vec.Count != n)

        {

            return -1;

        }

        else

        {

            int i = 0;

            foreach(int it in vec)

            {

                if (a[i++] != it)

                    return -1;

            }

        }

        return x;

    }

    public static void Main(String[] args)

    {

        int[] a = { 2, 5, 4, 10 };

        int n = a.Length;

        Console.Write(findX(a, n));

    }

}

Javascript

<script>

function findX(a, n)

{

    a.sort((x,y) => x - y);

    let x = a[0] * a[n - 1];

    let vec = [];

    for (let i = 2; i * i <= x; i++)

    {

        if (x % i == 0)

        {

            vec.push(i);

            if (parseInt(x / i) != i)

                vec.push(parseInt(x / i));

        }

    }

    vec.sort((x,y) => x - y);

    if (vec.length != n)

        return -1;

    else

    {

        let i = 0;

        for (let j = 0; j < vec.length; j++)

        {

            if (a[i++] != vec[j])

                return -1;

        }

    }

    return x;

}

    let a = [ 2, 5, 4, 10 ];

    let n = a.length;

    document.write(findX(a, n));

</script>

Time Complexity:

  • Sorting the array takes O(n log n) time.
  • Finding the divisors of x takes O(sqrt(x)) time.
  • Sorting the vector takes O(n log n) time.
  • Comparing the elements of the vector and array takes O(n) time.

Therefore, the time complexity of the function is O(n log n + sqrt(x) + n log n + n) which can be simplified to O(sqrt(x) + n log n).

Auxiliary Space:

  • The function uses a vector to store the divisors of x, which has a maximum size of sqrt(x).
  • Therefore, the auxiliary space used by the function is O(sqrt(x)).

Space Complexity:

  • The input array has a space complexity of O(n).
  • The auxiliary space used by the function is O(sqrt(x)).
  • Therefore, the space complexity of the function is O(n + sqrt(x)).

Last Updated :
21 Mar, 2023

Like Article

Save Article

Правила форума

В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте

его в существующую тему, а создайте новую в корневом разделе “Помогите решить/разобраться (М)”.

Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.

Не ищите на этом форуме халяву

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

и указать конкретные затруднения.

Обязательно просмотрите тему

Правила данного раздела, иначе Ваша тема может быть удалена

или перемещена в Карантин, а Вы так и не узнаете, почему.

 

 Найти число по количеству делителей и их сумме

Сообщение15.04.2011, 23:51 

Аватара пользователя


24/03/09
43
Питер

Всем привет.
Друзья, попала мне вот такая вот, казалось бы, не сложная задачка:

Нам известно, что у числа $n$ $6$ делителей. (Включая $1$ и само число $n$). Чему равно это $n$, если сумма делителей равно $126$?

P.S. Нашел в интернете похожую задачку. Условие такое же, только сумма равна $124$. В таком случае подходит число 75, ведь: $1+75+15+5+25+3=124$
Возможно в моем условии очепятка и там должно стоять число 124?
Но как доказать в случае 124=>75 я тоже не очень понял.

Благодарю за помощь!

Профиль  

ИСН 

 Re: Делители

Сообщение16.04.2011, 00:16 

Заслуженный участник
Аватара пользователя


18/05/06
13417
с Территории

Такое число (которое даёт 126) тоже есть, а находится оно длительной вознёй с разложением на простые.
Или уж перебором.

Профиль  

svv 

 Re: Делители

Сообщение16.04.2011, 00:36 

Заслуженный участник


23/07/08
10073
Crna Gora

Нашел простой способ.

Пусть разложение $n$ на простые множители имеет вид $n=ab$. Тогда $n$ имеет $4$ делителя: $1$, $a$, $b$, $ab=n$. Мало что-то у нас делителей, по условию должно быть $6$.

Прибавим ещё один простой множитель. Теперь $n=abc$. Тогда $n$ имеет аж $8$ делителей: $1$, $a$, $b$, $c$, $ab$, $ac$, $bc$, $abc=n$. Перебор.

Где же выход? А он есть. :-)

Профиль  

bot 

 Re: Делители

Сообщение16.04.2011, 05:55 

Заслуженный участник
Аватара пользователя


21/12/05
5849
Новосибирск

Число и сумма делителей
Разложение в произведение простых может быть Либо $n=p^5$ либо $n=pq^2$.
Первый случай отпадает сразу (p=2 – сумма недолетает, p=3 – перелетает), со вторым тоже разговор короткий: $q=2, 3, 5$. Решений нет.

— Сб апр 16, 2011 10:03:02 —

Упс, 126 ведь на 7 делится – ИСН

прав, решение есть.

Профиль  

VAL 

Re: Делители

Сообщение16.04.2011, 08:05 

Заслуженный участник


27/06/08
4051
Волгоград

Такое число (которое даёт 126) тоже есть, а находится оно длительной вознёй с разложением на простые.
Или уж перебором.

Зачем, зря пугаете? 30 секунд (этого вполне достаточно для полного обоснованного решения задачи) – это длительная возня?

PS: Разумеется, подход тот же, что у bot

‘а.
1) $n=pq^2  (n=p^5$ не подходит);
2) $126=(p+1)(q^2+q+1)$
И первое же $q$ дает ответ.

Профиль  

Модераторы: Модераторы Математики, Супермодераторы

34K

06 апреля 2008 года

Carbon

17 / / 21.03.2008

Плохая задачка.
Только перебор, возможно, немного оптимизированный, больше ничего я в инете не нашёл, даже на сайте про последовательности, вот тут универсальной формулы для этой последовательности (миннимальное число с заданным количеством делителей) нет.

Немного опоздал с ответом, но вот моё решение:
1) Количество простых делителей 12 (2^12=4096, 2^13=8192). Будем работать с разложением числа. Тогда выписываем первые 12 простых чисел.
2) D раскладываем на простые множители и сопоставляем их каждому простому числу в порядке убывания (84=2*2*3*7 => 2:6, 3:2, 5:1, 7:1).
3) Получаем число 2^6*3^2*5^1*7^1. Проходим по степеням с конца массива. Если число уменьшится при переносе степени на более раннюю позицию, то выполнится условие: a^u*b^v>a^((u+1)*(v+1)-1) (a<b).
Получаем: lnb>(u+1)lna. Если это условие выполняется, то при переносе число уменьшится. Для максимального уменьшения выбираем минимум чисел (u+1)lna. Для числа a ставим степень (u+1)*(v+1)-1, для числа b – 0.
4) Проходим по массиву и находим произведение чисел a^u. Если число превышает 10^15+1, то останавливаемся.

Общая сложность алгоритма O(sqrt(D)). Можно оптимизировать шаг 3), но и так скорость высокая, поэтому не стОит. И никакого перебора не нужно.

Код:

#include <stdio.h>
#include <math.h>

int main(int argc, char* argv[])
{
    const long long limit=100000I64*100000I64*100000I64+1I64;
    double min,v;
    long long res=1I64;
    int D,nums[12]={2,3,5,7,11,13,17,19,23,29,31,37},
    divisors[12],temp[12],count=0,index;
    bool stop;

    scanf(“%d”,&D);
    index=sqrt((double)D);
    for (int i=2;i<=index;)
        if (D%i==0)
        {
            D/=i;
            temp[count]=i-1;
            count++;
        }
        else
            i++;

    if (D>1)
    {
        temp[count]=D-1;
        count++;
    }

    for (int i=0;i<count;i++)
        divisors[count-1-i]=temp;

    for (int i=count-1;i>=1;i–)
    {
        min=30000.0;
        for (int j=i-1;j>=0;j–)
        {
            v=(double)(divisors[j]+1)*log((double)nums[j]);
            if (v<min)
            {
                min=v;
                index=j;
            }
        }
        if (min<log((double)nums))
        {
            divisors[index]=(divisors[index]+1)*(divisors+1)-1;
            divisors=0;
        }
    }

    stop=false;
    for (int i=0;i<count&&!stop;i++)
        for (int j=0;j<divisors&&!stop;j++)
        {
            res*=(long long)nums;
            stop=res>limit;
        }

    if (stop)
        printf(“0”);
    else
        printf(“%I64d”,res);

    getchar();
    getchar();

    return 0;
}

Как найти числа с определённым количеством делителей?

Артия Стреллби



Ученик

(65),
закрыт



9 лет назад

проходчик Ветров

Гуру

(4682)


9 лет назад

В самом общем случае, количество возможных делителей произвольного числа бесконечно. Фактически, это все не равные нулю числа. Но если речь идет о натуральных числах, то под делителем числа N подразумевается такое натуральное число, на которое нацело делится число N. Количество таких делителей всегда ограничено, а найти их можно с помощью специальных алгоритмов. Также существуют простые делители числа, которые представляют собой простые числа.

Подробнее ЧИТАЙТЕ ЗДЕСЬ

Добавить комментарий