Ошибка.
Попробуйте повторить позже
Найдите все натуральные числа, принадлежащие отрезку [ ; ], у которых ровно различных четных делителей. В ответе укажите количество данных чисел.
Если число имеет разложение вида ... , то количество чётных делителей такого числа равно ... (выбрали степень двойки от до , степень каждого простого от до ). По условию это равно — простое число, как произведение натуральных чисел его можно представить как или .
Случай : , все число равно , не подходит.
Случай : , какое-то , все остальные — приходим к разложению вида .
На частном случае решение будет выглядеть так:
С помощью стандартной программы найдем подходящие нам числа до для того, чтобы рассмотреть их:
def dividers(n): k = 0 for i in range(1, int(n ** 0.5) + 1): if n % i == 0: if i % 2 == 0: k += 1 if (n // i) % 2 == 0 and n // i != i: k += 1 return k for i in range(1, 100000): if dividers(i) == 7: print(i)
Подходящие нам числа в диапазоне до - это , и . Хочется разложить эти числа:
Заметим, что все числа раскладываются на , где - простое число.
Воспользуемся выведенной формулой для решения:
def prime(x): for i in range(2, int(x**0.5)+1): if x % i == 0: return False return True ans = 0 for i in range(int((33333333 // 2)**(1/6)), int((333333333 // 2)**(1/6)) + 1): if prime(i): if 33333333 <= 2*(i**6) <= 333333333: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Найдите все натуральные числа, принадлежащие отрезку [11 111 111; 77 777 777], у которых ровно различных делителей. В ответе укажите количество данных чисел.
def prime(x): for i in range(2, int(x**0.5)+1): if x % i == 0: return False return True ans = 0 for i in range(int(11111111**0.25), int((77777777+1)**0.25)+1): if prime(i): ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Назовем натуральное число подходящим, если оно среди натуральных чисел с такой же, как у него, суммой цифр является минимальным.
Найдите количество подходящих чисел, кратных на отрезке
Для начала поймем, какие числа являются подходящими и кратными :
def num(x): summ = 0 while x > 0: summ += x % 10 x //= 10 return summ a = set() for i in range(1, 6999999999+1): t = num(i) if not t in a: if i % 3 == 0: print(i, t) a.add(t)
Данный код будет печатать числа , а затем те числа, которые начинаются с , или , а остальная часть которых будет целиком состоять из .
Предлагается написать код-генератор для подобных чисел:
ans = [3, 6, 9] nums = ’369’ x = ’9’ for i in range(9): for digit in nums: result = int(digit + x) if result <= 6999999999: ans.append(result) x += ’9’ print(len(ans))
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске и делящиеся на без остатка. В ответе запишите количество найденных чисел.
Решение 1
ans = 0 for i in range(1, 10): # пустая звёздочка s = str(i) + ’1231’ if int(s) % 11 == 0: ans += 1 #односимвольная звёздочка for w in range(10): s1 = str(i) + ’123’ + str(w) + ’1’ if int(s1) % 11 == 0: ans += 1 #двухсимвольная звёздочка for w in range(10): for z in range(10): s2 = str(i) + ’123’ + str(w) + str(z) + ’1’ if int(s2) % 11 == 0: ans += 1 print(ans)
Решение 2
from itertools import product ans = 0 for i in range(1, 10): for k in range(0, 3): for j in product(’0123456789’, repeat=k): s = str(i) + ’123’ + ’’.join(j) + ’1’ if int(s) % 11 == 0: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске *?? и делящиеся на без остатка. В ответе запишите количество найденных чисел.
ans = 0 for i in range(10): for j in range(10): # пустая звёздочка s = ’829’ + str(i) + ’17’ + str(j) if int(s) % 31 == 0: ans += 1 #односимвольная звёздочка for w in range(1, 10): #число не начинается с 0 s1 = str(w) + ’829’ + str(i) + ’17’ + str(j) if int(s1) % 31 == 0: ans += 1 #двухсимвольная звёздочка for w in range(1, 10): #число не начинается с 0 for z in range(10): s2 = str(w) + str(z) + ’829’ + str(i) + ’17’ + str(j) if int(s2) % 31 == 0: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске * и делящиеся на без остатка. В ответе запишите количество найденных чисел.
ans = 0 # пустая звёздочка if 2738 % 7 == 0: ans += 1 #односимвольная звёздочка for w in range(10): s1 = ’2738’ + str(w) if int(s1) % 7 == 0: ans += 1 #двухсимвольная звёздочка for w in range(10): for z in range(10): s2 = ’2738’ + str(w) + str(z) if int(s2) % 7 == 0: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске ?? и делящиеся на без остатка. В ответе запишите количество найденных чисел.
ans = 0 for x in range(10): for i in range(10): n = int(’9’ + str(x) + ’123’ + str(i)) if n % 7 == 0: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске ?? и делящиеся на без остатка. В ответе запишите количество найденных чисел
ans = 0 for x in range(10): for i in [0, 5]: #любое число, оканчивающееся на 0 или 5, делится на 5 ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая получает на вход число и возвращает количество его делителей. В ответе укажите количество делителей для числа .
Решение 1
count = 0 x = int(input()) for i in range(1, int(x ** 0.5) + 1): if x % i == 0: count += 1 if x // i != i: count += 1 print(count)
Решение 2
a = set() x = int(input()) for i in range(1, int(x ** 0.5) + 1): if x % i == 0: a.add(i) a.add(x // i) print(len(a))
Ошибка.
Попробуйте повторить позже
Дано число и массив с числами . Назовем «подходящими» элементы массива, которые являются делителями числа . Найдите сумму чисел, которые в паре с «подходящими» элементами массива дают произведение равное .
a = [1, 2, 98, 43, 89, 739] x = 1052336 summa = 0 for i in a: if x % i == 0: summa += x // i print(summa)
Ошибка.
Попробуйте повторить позже
Для найдите разность между количеством делителей числа , которые больше квадратного корня из и количеством делителей числа , которые меньше квадратного корня из . В ответе укажите искомую разность.
Обратим внимание, что если - делитель числа , то и - делитель числа . Очевидно, эти два числа находятся по разную сторону от (иначе, предположим, что они оба меньше, тогда чего явно не может быть, случай, когда оба больше - аналогичен). Таким образом, мы видим, что все делители разбиваются на пары, в которых один делитель меньше корня, а другой - больше. Отсюда понимаем, что делителей, меньших корня столько же, сколько и больших.
print(0)
А теперь представим, что мы не знаем математику, и попробуем решить это другим способом:
x = 3052336 sq = x ** 0.5 more = 0 less = 0 for i in range(1, x + 1): if x % i == 0: if i > sq: more += 1 if i < sq: less += 1 print(more - less)
Ошибка.
Попробуйте повторить позже
Утверждается, что количество делителей числа четно. Найдите количество пар делителей числа , произведение которых равно исходному числу. При этом пары делителей выбираются следующим образом минимальный делитель * максимальный делитель, предминимальный делитель * предмаксимальный делитель и т.д. В ответе укажите два числа через пробел: сначала количество рассматриваемых пар, затем количеством пар, произведение которых равно исходному числу.
a = [] x = 2052336 for i in range(1, x + 1): if x % i == 0: a.append(i) count = 0 n = len(a) for i in range(n // 2): if a[i] * a[n - i - 1] == x: count += 1 print(n // 2, count)
Ошибка.
Попробуйте повторить позже
Тимофей любит число и все числа кратные
Вопрос — где первое вхождение кратного в последовательности ? Если последовательность не содержит кратных , в ответе вместо этого запишите .
Поскольку -й член данной последовательности можно записать в виде , посчитаем сумму геометрической прогрессии, поэтому искомым ответом является минимальное натуральное число , такое что делится на . Если кратно , вы можете рассмотреть, делится ли на вместо этого и в противном случае вы можете рассмотреть, делится ли на . Поэтому давайте определим целое число таким образом, что если кратно или в противном случае. Теперь достаточно найти минимальное натуральное число i такое, что делится на , т. е. такое что остаток от деления на равен . Если кратно , то кратно для любого положительного целого числа , поэтому его остаток деленное на никогда не будет равно . То же самое относится, когда кратно . Если ни одно из них не выполняется, то по теореме Эйлера выполняется (mod ).
Поэтому, вам достаточно рассмотреть лишь подсчитать функцию эйлера за и проверить все делители её значения. Потому что фактически в задаче вас просят найти показатель числа по модулю .
Заметьте, что, не прибегая к приведенному выше математическому наблюдению, вы можете предположить, что «если ответ не равен , тогда ответ будет довольно маленьким;
Маленьким значит не более . Поэтому вы можете рассмотреть первые значений.
Поэтому фактически в задаче всего лишь требуется подсчитать сумму геометрической прогрессии и написать перебор
Решение на С++
void solve() { int K; K = 999983; int cur = 10; for(int i = 0; i < 9 * K; ++i){ if(7 * (cur - 1) % (9 * K) == 0){ cout << i + 1 << "\n"; return 0; } cur = (cur * 10) % (9 * K); } cout << "-1\n"; return 0; }
Решение на Python
k = 999983 ans = -1 s = 7 for i in range(10 ** 6): if s % k == 0: ans = i + 1 break s = s * 10 + 7 print(ans)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске *? и делящиеся на без остатка.
В ответе запишите количество найденных чисел.
count = 0 for x in "1234567890": count += (int("12" + "4" + x + "65") % 141 == 0) for y in "1234567890": count += (int("12" + y + "4" + x + "65") % 141 == 0) for z in "1234567890": count += (int("12" + y + z + "4" + x + "65") % 141 == 0) print(count)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, где сумма всех делителей числа соответствует маске *. В ответе запишите количество найденных чисел.
def summa(n): s = set() for i in range(1, int(n**0.5)+1): if n % i == 0: s.add(i) s.add(n // i) return sum(s) ans = 0 res = [] for i in range(1, 1000001): num = str(summa(i)) if len(num) >= 3: if num[0] == ’1’ and int(num) % 100 == 38: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске и делящиеся на без остатка. В ответе запишите количество найденных чисел.
ans = 0 for i in range(10): for j in range(10): # пустая звёздочка s = ’1’ + str(i) + ’38’ + str(j) + ’70’ if int(s) % 11 == 0: ans += 1 #односимвольная звёздочка for w in range(10): s1 = ’1’ + str(i) + ’38’ + str(j) + ’70’ + str(w) if int(s1) % 11 == 0: ans += 1 #двухсимвольная звёздочка for w in range(10): for z in range(10): s2 = ’1’ + str(i) + ’38’ + str(j) + ’70’ + str(w) + str(z) if int(s2) % 11 == 0: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , простые числа. Программа должна вывести количество таких чисел.
def is_prime(n): for i in range(2, int(n**0.5)+1): if n % i == 0: return False return True k = 0 for x in range(56846, 59034): if is_prime(x): k += 1 print(k)
Ошибка.
Попробуйте повторить позже
Назовём числа и числами-близнецами, если .
Найдите наименьшее натуральное число, имеющее ровно 512 делителей, простые делители которого образуют не менее трёх пар чисел-близнецов. В ответе укажите число, а также все его простые делители.
from itertools import combinations_with_replacement def prime(x): for i in range(2, int(x ** 0.5) + 1): if x % i == 0: return False return True def count_del(x): ans = [] for i in range(2, int(x ** 0.5) + 1): if x % i == 0: ans += [i] ans += [x // i] return sorted(list(set(ans))) def check(a): ans = 1 for i in range(len(a)): ans *= a[i] if ans > 512: return False return ans == 512 dels = count_del(512) primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] # Если скобок 9 штук и каждое альфа равно 1 minim = 2 ** 511 # Если скобок 9 штук и каждое альфа равно 1 t = 1 degrees = [2] * 9 for k in range(len(degrees)): t *= (primes[k] ** (degrees[k] - 1)) minim = min(minim, t) # Все остальные случаи for j in range(2, 9): for i in combinations_with_replacement(dels, j): if check(i): t = 1 degrees = i[::-1] for k in range(len(degrees)): t = t * (primes[k] ** (degrees[k] - 1)) minim = min(minim, t) print(minim, *[i for i in count_del(minim) if prime(i)])
Ошибка.
Попробуйте повторить позже
Найдите максимальное число на отрезке [1010101; 101010101], имеющее ровно 128 делителей, которое будет кратно 16. Выведите на экран в первой строке найденное число, а во второй все его нечетные делители в порядке возрастания.
def count_del(x): ans = [1, x] for i in range(2, int(x**0.5)+1): if x % i == 0: ans += [i] if i != x // i: ans += [x//i] if len(ans) > 128: return ans return ans for i in range(101010101, 1010101-1, -1): if len(count_del(i)) == 128 and i % 16 == 0: print(i, *sorted([i for i in count_del(i) if i % 2 != 0])) break
Ошибка.
Попробуйте повторить позже
Найдите наибольшее натуральное число на отрезке , которое имеет ровно делителей. В ответе укажите число.
def divs(n): count = 0 for i in range(1,int(n**0.5)+1): if n%i==0: count += 1 if i!=n//i: count += 1 return count for x in range(5000000, 10000 - 1, -1): if divs(x) == 10: print(x) break