gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||
1 |
||||
Найти число по количеству делителей17.01.2021, 19:52. Показов 9341. Ответов 14 Метки python 3, питон (Все метки)
Формат ввода Формат вывода Пример 1 Вот код, чтобы найти кол-во делителей числа, а как наоборот?
0 |
unfindable_404 690 / 473 / 204 Регистрация: 22.03.2020 Сообщений: 1,052 |
||||
17.01.2021, 20:32 |
2 |
|||
На основе вашего кода:
1 |
7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,870 |
|
17.01.2021, 20:42 |
3 |
gray621, подсказка – количество делителей :
1 |
gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||
17.01.2021, 20:52 [ТС] |
4 |
|||
divs = int(input()) Спасибо, у меня не получалось придумать ещё n, а так всё такое же. Добавлено через 5 минут
Код не работает на 18 тесте, превышен лимит времени, можно как-то ускорить цикл?
0 |
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 |
ограничения на “n” есть ? Нет, но есть ограничение на время 1 секунда, а тест идёт 1064 ms, то есть нужно ускорить цикл немножко. Добавлено через 15 минут
0 |
3483 / 2090 / 560 Регистрация: 02.09.2015 Сообщений: 5,335 |
|
17.01.2021, 21:35 |
7 |
Нарыл решение Но оно не удовлетворяет условию:
При решении нельзя использовать функции и методы, а также списки и словари. В т. ч. мемоизация.
0 |
Gdez 7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,870 |
||||
17.01.2021, 22:08 |
8 |
|||
Сообщение было отмечено gray621 как решение Решениеgray621, если не ошибся
Добавлено через 7 минут
1 |
Arsegg |
17.01.2021, 22:34
|
Не по теме:
Если интересует, то возможно найду задачу на кодфорс. Полагаю, задача div1. 😀
0 |
gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||
17.01.2021, 22:49 [ТС] |
10 |
|||
divs = int(input()) А почему там n в корень возводится, а не пополам делится? Добавлено через 5 минут
?
0 |
7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,870 |
|
17.01.2021, 23:11 |
11 |
Arsegg, Добавлено через 5 минут А почему там n в корень возводится, а не пополам делится? Потому что это не слагаемые, а делители. Допустим для 40 не нужно искать делители больше 6, сразу считать парами – 1 и 40, 2 и 20, 4 и 10, 5 и 8; всего 8 делителей. Добавлено через 5 минут
2 |
36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
|
17.01.2021, 23:25 [ТС] |
12 |
если число не квадрат другого числа, то количество делителей четное То есть у квадратов чисел корни натуральные числа?
0 |
7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,870 |
|
17.01.2021, 23:41 |
13 |
gray621, нет Добавлено через 2 минуты
0 |
gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||||||
18.01.2021, 00:14 [ТС] |
14 |
|||||||
Когда найдешь код, который пройдет все тесты Твой код прошёл Добавлено через 15 секунд
Когда найдешь код, который пройдет все тесты Твой код прошёл Добавлено через 10 секунд
Когда найдешь код, который пройдет все тесты Твой код прошёл Добавлено через 22 минуты
И ещё почему в range + 1?
0 |
Gdez 7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,870 |
||||
18.01.2021, 04:38 |
15 |
|||
gray621, Зачем проверка для чётного кол-во делителей Потому что для четных диапазон :
Для нечетных изначально можно не включать значение корня (для 36 число 6 уже входит -> count_of_dividers = 1)
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
18.01.2021, 04:38 |
Помогаю со студенческими работами здесь Дано число P, нужно найти число от 1 до Р, с наибольшим количеством делителей int p; Дано натуральное число N. Найти число от 1 до N с максимальной суммою делителей Формат входных… Дано натуральное число n. Найти число от 1 до n, имеющий как можно большее сумму делителей . Найти число всех натуральных делителей числа , которые не превосходят это число и взаимно простых с ним: а) 720, б) 3179, в) 6615 Перестановка элементов массива по количеству делителей Расставьте данный массив натуральных чисел по количеству их делителей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 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: 20Input: arr[] = {2, 10, 5}
Output: 20Input: 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 |
Всем привет. Нам известно, что у числа делителей. (Включая и само число ). Чему равно это , если сумма делителей равно ? P.S. Нашел в интернете похожую задачку. Условие такое же, только сумма равна . В таком случае подходит число 75, ведь: Благодарю за помощь!
|
|
|
ИСН |
Re: Делители 16.04.2011, 00:16 |
||
18/05/06 |
Такое число (которое даёт 126) тоже есть, а находится оно длительной вознёй с разложением на простые.
|
||
|
|||
svv |
Re: Делители 16.04.2011, 00:36 |
||
23/07/08 |
Нашел простой способ. Пусть разложение на простые множители имеет вид . Тогда имеет делителя: , , , . Мало что-то у нас делителей, по условию должно быть . Прибавим ещё один простой множитель. Теперь . Тогда имеет аж делителей: , , , , , , , . Перебор. Где же выход? А он есть.
|
||
|
|||
bot |
Re: Делители 16.04.2011, 05:55 |
||
21/12/05 |
Число и сумма делителей — Сб апр 16, 2011 10:03:02 — Упс, 126 ведь на 7 делится – ИСН прав, решение есть.
|
||
|
|||
VAL |
Re: Делители 16.04.2011, 08:05 |
||
27/06/08 |
Такое число (которое даёт 126) тоже есть, а находится оно длительной вознёй с разложением на простые. Зачем, зря пугаете? 30 секунд (этого вполне достаточно для полного обоснованного решения задачи) – это длительная возня? PS: Разумеется, подход тот же, что у bot ‘а.
|
||
|
|||
Модераторы: Модераторы Математики, Супермодераторы
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. Количество таких делителей всегда ограничено, а найти их можно с помощью специальных алгоритмов. Также существуют простые делители числа, которые представляют собой простые числа.
Подробнее ЧИТАЙТЕ ЗДЕСЬ