Тема 25. Программирование - Обработка целочисленной информации
25.05 Прочие прототипы
Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование - обработка целочисленной информации
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#37827

Тимофей любит число 7  и все числа кратные 999983.

Вопрос — где первое вхождение кратного K (K = 999983)  в последовательности 7,77,777,...  ? Если последовательность не содержит кратных 999983  , в ответе вместо этого запишите − 1  .

Показать ответ и решение

Поскольку i  -й член данной последовательности можно записать в виде 7⋅(1+ 10+ 102 + 103 + ⋅⋅⋅+ 10(i−1))  , посчитаем сумму геометрической прогрессии, поэтому искомым ответом является минимальное натуральное число i  , такое что 7 ⋅(10i − 1)  делится на 9K  . Если K  кратно 7  , вы можете рассмотреть, делится ли 10i− 1  на 9K∕∕7  вместо этого и в противном случае вы можете рассмотреть, делится ли   i
10 − 1  на 9K  . Поэтому давайте определим целое число L  таким образом, что L = 9K ∕7  если K  кратно 7  или L = 9K  в противном случае. Теперь достаточно найти минимальное натуральное число i такое, что 10i − 1  делится на L  , т. е. такое что остаток от деления 10i  на L  равен 1  . Если L  кратно 2  , то 10i  кратно 2  для любого положительного целого числа i  , поэтому его остаток деленное на L  никогда не будет равно 1  . То же самое относится, когда L  кратно 5  . Если ни одно из них не выполняется, то по теореме Эйлера выполняется 10φ(L ) ≡ 1  (mod L  ).

Поэтому, вам достаточно рассмотреть лишь подсчитать функцию эйлера за   √ --
O(  N)  и проверить все делители её значения. Потому что фактически в задаче вас просят найти показатель числа 10  по модулю L  .

Заметьте, что, не прибегая к приведенному выше математическому наблюдению, вы можете предположить, что «если ответ не равен − 1  , тогда ответ будет довольно маленьким;

Маленьким значит не более 9 ⋅K  . Поэтому вы можете рассмотреть первые 9K  значений.

Поэтому фактически в задаче всего лишь требуется подсчитать сумму геометрической прогрессии и написать перебор

Решение на С++

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)

Ответ: 999982

Ошибка.
Попробуйте повторить позже

Задача 2#30240

Найдите все натуральные числа, N, принадлежащие отрезку [250 000 000; 700 000 000], которые можно представить в виде N  = 2∗∗m ∗ 5∗∗n  , где m – чётное число, n — чётное число. В ответе запишите все найденные числа в порядке убывания, а справа от каждого числа — сумму всех его нетривиальных делителей.

Показать ответ и решение
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]  
            if i != x // i:  
                ans += [x//i]  
    return sum(ans)  
ans = []  
for i in range(0, 100, 2):  
    for j in range(0, 100, 2):  
        N = 2**i*5**j  
        if 250000000 <= N <= 700000000:  
            ans.append([N, count_del(N)])  
ans = sorted(ans, reverse = True)  
for i in range(len(ans)):  
    print(*ans[i])

Ответ: 655360000 982514930 625000000 925292936 419430400 620756960 400000000 599511206 268435456 268435454 256000000 383972276

Ошибка.
Попробуйте повторить позже

Задача 3#30239

Найдите все натуральные числа, N, принадлежащие отрезку [100 000 000; 500 000 000], которые можно представить в виде N  = 3∗∗m ∗ 7∗∗n  , где m – нечётное число, n — чётное число. В ответе запишите все найденные числа в порядке возрастания, а справа от каждого числа — сумму m+n.

Показать ответ и решение
def prime(x):  
    for i in range(2, int(x**0.5)+1):  
        if x % i == 0:  
            return False  
    return True  
ans = []  
for i in range(1, 101, 2):  
    for j in range(0, 100, 2):  
        N = 3**i*7**j  
        if 100000000 <= N <= 500000000:  
            ans.append([N, i+j])  
ans = sorted(ans)  
for i in range(len(ans)):  
    print(*ans[i])

Ответ: 129140163 17 155649627 11 257298363 13 425329947 15

Ошибка.
Попробуйте повторить позже

Задача 4#29372

Пусть M (k) = 9000000+ k  , где k  — натуральное число. Найдите пять наименьших значений k  , при которых M (k)  нельзя представить в виде произведения трёх различных натуральных чисел, не равных 1  .

В ответе запишите найденные значения k  в порядке возрастания через пробел.

Показать ответ и решение
a = []
for x in range(2, 1000):
    for y in range(x + 1, x + 1000):
        t = max(int(9000000 / (x * y)), y + 1)
        m = int(9010000 / (x * y))
        for z in range(t, min(t + 300, m)):
            s = x * y * z
            if s > 9000000 and s not in a:
                a.append(s)
a.sort()
k = 0
for i in range(9000001, 1000000000):
    if i not in a:
        print(i - 9000000, end=’ ’)
        k += 1
        if k == 5:
            break

Ответ: 1 7 11 14 17

Ошибка.
Попробуйте повторить позже

Задача 5#28821

Найдите все натуральные числа N,  принадлежащие числовому отрезку [2 ⋅108;6 ⋅108],  которые можно представить в виде N  = 4m ⋅5n  (m,n - целые неотрицательные числа). Программа должна вывести количество таких чисел.

Показать ответ и решение
ans = 0
for m in range(100):
    for n in range(100):
        N = 4 ** m * 5 ** n
        if 2 * 10 ** 8 <= N <= 6 * 10 ** 8:
            ans += 1
print(ans)

Ответ: 10

Ошибка.
Попробуйте повторить позже

Задача 6#28551

Пусть M  — сумма минимального и максимального натурального делителей целого числа, не считая единицы и самого числа. Если таких делителей нет, то считаем значение M  равным нулю.

Напишите программу, которая перебирает целые числа, большие 425161  , в порядке возрастания и ищет среди них такие, для которых значение   при делении на 7  дает в остатке 3  . Вывести первые 5  найденных чисел через пробел.

Показать ответ и решение
def m(n):
    for x in range(2, int(n ** 0.5) + 1):
        if n % x == 0 and x != n // x:
            return x + n // x
    return 0

k = 0
for i in range(425162, 10000000000):
    if m(i) % 7 == 3:
        print(i, end=’ ’)
        k += 1
    if k == 5:
        break

Ответ: 425168 425182 425183 425187 425196

Ошибка.
Попробуйте повторить позже

Задача 7#27897

Найдите все натуральные числа N  , принадлежащие числовому отрезку [200000000;400000000]  , которые можно представить в виде N = 2m ⋅3n  , где m  - четное число, n  - нечетное число. Программа должна вывести количество таких чисел.

Показать ответ и решение
def inside(x, a):  
    if x>=a[0] and x <= a[1]:  
        return True  
    return False  
 
# Наш промежуток  
a = [200000000, 400000000]  
ans = 0  
# так как 2**29 > 400 000 000  
for m in range(0,29,2): # Так как четные  
    # так как 3**19 > 400 000 000  
    for n in range(1, 19, 2): # Так как нечетные  
        if inside(2**m * 3**n, a):  
            ans += 1  
print(ans)

Ответ: 4

Ошибка.
Попробуйте повторить позже

Задача 8#27896

Найдите все натуральные числа N  , принадлежащие числовому отрезку [200 000 000;600 000 000], которые можно представить в виде N = 4m ⋅5n  . Программа должна вывести количество таких чисел.

Показать ответ и решение
def inside(x, a):  
    if x>=a[0] and x <= a[1]:  
        return True  
    return False  
 
# Наш промежуток  
a = [200000000, 600000000]  
ans = 0  
# так как 4**15 > 600 000 000  
for m in range(15):  
    # так как 5**13 > 600 000 000  
    for n in range(13):  
        if inside(4**m * 5**n, a):  
            ans += 1  
print(ans)

Ответ: 10

Ошибка.
Попробуйте повторить позже

Задача 9#27888

Пусть M - сумма минимального и максимального натурального делителей целого числа, не считая единицы и самого числа. Если таких делителей нет, то считаем значение M равным нулю.

Напишите программу, которая перебирает целые числа, большие 452 021, в порядке возрастания и ищет среди них такие, для которых значение М при делении на 7 дает в остатке 3. Вывести первые 5 найденных чисел и соответствующие им значения М.

Показать ответ и решение
def m(n):  
    for i in range(2, int(n ** 0.5) + 1):  
        if n % i == 0:  
            return i + n // i  
    return 0  
k = 0  
for i in range(452021 + 1, 10000000000000):  
    if m(i) % 7 == 3:  
        print(i, m(i))  
        k += 1  
    if k == 5: break

Ответ: 452025 150678 452029 23810 452034 226019 452048 226026 452062 226033

Ошибка.
Попробуйте повторить позже

Задача 10#27886

Пусть M(N) – произведение 5 наименьших различных натуральных делителей натурального числа N, не считая единицы. Если у числа N меньше 5 таких делителей, то M(N) считается равным нулю.

Найдите 5 наименьших натуральных чисел, превышающих 500 000 000, для которых 0 < M (N) < N  .

В ответе запишите найденные значения M(N) в порядке возрастания соответствующих им чисел N.

Показать ответ и решение
counter = 0  
x = 500000001  
while counter < 5:  
    d = set()  
    for i in range(2, int(x ** 0.5) + 1):  
        if x % i == 0:  
            d |= {i, x // i}  
    if len(d) >= 5:  
        d = sorted(d)[:5]  
        p = 1  
        for i in d:  
            p *= i  
        if p < x:  
            print(p)  
            counter += 1  
    x += 1

Ответ: 1008 1797092 48408867 1800 1156923

Ошибка.
Попробуйте повторить позже

Задача 11#27883

Напишите программу, которая вычислит среднее арифметическое значений

aφ(1013)%1013  , где a это числа, не превышающие 1013 и взаимно простые с ним.

Показать ответ и решение

По теореме Эйлера aφ(n) ≡ 1(mod n)  , так что все значения равны 1, и, следовательно, их среднее – тоже. (Кстати, из того, что φ(p) = p− 1  для простых p следует Малая теорема Ферма ap−1 ≡ 1(mod p)  , которая применима и в этой задаче, так как 1013 простое).

print(1)

Ладно-ладно, снова шучу. Последний раз, обещаю.

def gcd(a, b):  
    if a == b:  
        return a  
    if a != 0 and b != 0:  
        return gcd(a % b, b % a)  
    else:  
        return a + b  
 
 
def phi(n):  
    fi = 0  
    for i in range(1, n + 1):  
        if gcd(n, i) == 1:  
            fi += 1  
    return fi  
 
 
n = 1013  
sum = 0  
count = 0  
for a in range(1, n + 1):  
    if gcd(n, a) == 1:  
        sum += (a ** phi(n)) % n  
        count += 1  
print(sum // count)

Ответ: 1

Ошибка.
Попробуйте повторить позже

Задача 12#26131

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [175256;196429]  , числа кратные 57  или 19  , но не кратные одновременно и 57  и 19  . Выведите количество таких чисел.

Показать ответ и решение
count = 0
for i in range(175256, 196429):
    if (i % 57 == 0 and i % 19 != 0) or (i % 57 != 0 and i % 19 == 0):
        count += 1
print(count)

Ответ: 743

Ошибка.
Попробуйте повторить позже

Задача 13#26104

Найдите все натуральные числа, принадлежащие отрезку [95 000 000; 130 000 000], у которых ровно пять различных чётных делителей (количество нечётных делителей может быть любым). В ответе перечислите найденные числа в порядке убывания.

Показать ответ и решение
def is_prime(n):
    for j in range(2, int(n ** 0.5) + 1):
        if n % j == 0:
            return False
    return True

ans = []
for i in range(3, 1000):
    if is_prime(i):
        t = i ** 4 * 2
        if 95000000 <= t <= 130000000:
            ans.append(t)
ans.sort(reverse=True)
print(*ans)

Ответ: 125484482

Ошибка.
Попробуйте повторить позже

Задача 14#25998

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [164925;623594]  , числа кратные двум или трем, но не кратные одновременно и двум, и трём. Выведите количество таких чисел.

Показать ответ и решение
counter = 0
for i in range(164925, 623594+1):
    if (i % 2 == 0 or i % 3 == 0) and not(i % 2 == 0 and i % 3 == 0):
        counter += 1
print(counter)

Ответ: 229335

Ошибка.
Попробуйте повторить позже

Задача 15#25971

Обозначим через M  целую часть среднего арифметического всех простых делителей целого числа, не считая самого числа. Если таких делителей у числа нет, то считаем значение M  равным нулю. Напишите программу, которая перебирает целые числа, большие 420000  , в порядке возрастания и ищет среди них такие, для которых значение M  при делении на 42  даёт в остатке 24  . Выведите первые 5  найденных числа в порядке возрастания через пробел.

Показать ответ и решение
def prime(n):
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            return False
    return True


def count_divs(n):
    divs = []
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            if prime(i):
                divs.append(i)
            if i != n//i:
                if prime(n//i):
                    divs.append(n//i)
    if divs == []:
        return 0
    return sum(divs)//len(divs)


counter = 0
for i in range(420000, 1000000000):
    if count_divs(i) % 42 == 24:
        print(i)
        counter += 1
        if counter == 5:
            break

Ответ: 420036 420116 420119 420126 420230

Ошибка.
Попробуйте повторить позже

Задача 16#25623

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [10000; 90000], числа в которых сумма второй и четвёртой цифры равны сумме перой, третей и пятой цифрам. Программа должна вывести количество таких чисел.

Показать ответ и решение
counter = 0
for i in range(10000, 90000):
    t = str(i)
    if int(t[1]) + int(t[3]) == int(t[0]) + int(t[2]) + int(t[4]):
        counter += 1
print(counter)

Ответ: 3950

Ошибка.
Попробуйте повторить позже

Задача 17#24943

Найдите все натуральные числа, N, принадлежащие отрезку [100 000 000; 500 000 000], которые можно представить в виде N  = 3m ∗ 7n  , где m – нечётное число, n — чётное число. В ответе запишите все найденные числа в порядке возрастания, а справа от каждого числа — сумму m+n, разделяя все числа пробелом.

Показать ответ и решение
ans = []  
for i in range(1, 101, 2):  
    for j in range(0, 100, 2):  
        N = 3**i*7**j  
        if 100000000 <= N <= 500000000:  
            ans.append([N, i+j])  
ans = sorted(ans)  
for i in range(len(ans)):  
    print(*ans[i])

Ответ: 129140163 17 155649627 11 257298363 13 425329947 15

Ошибка.
Попробуйте повторить позже

Задача 18#22906

Найдите все натуральные числа, N, принадлежащие отрезку [200 000 000; 600 000 000], которые можно представить в виде N  = 4m ⋅5n,  где m – чётное число, n – нечётное число. В ответе запишите все найденные числа в порядке возрастания через пробел.

Показать ответ и решение
for m in range(0, 1000, 2):
    for n in range(1, 1000, 2):
        N = 4**m * 5**n
        if 200_000_000 < N < 600_000_000:
            print(N)

Ответ: 204800000 320000000 500000000

Ошибка.
Попробуйте повторить позже

Задача 19#22219

Найдите все натуральные числа, N, принадлежащие отрезку [250 000 000; 700 000 000], которые можно представить в виде N  = 2m ∗ 5n  , где m − чётное число, n − чётное число. В ответе запишите все найденные числа в порядке убывания, а справа от каждого числа − сумму всех его нетривиальных делителей. В ответ числа разделять ровно одним пробелом.

Показать ответ и решение
def count_del(x):  
    ans = []  
    for i in range(2, int(x**0.5)+1):  
        if x % i == 0:  
            ans += [i]  
            if i != x // i:  
                ans += [x//i]  
    return sum(ans)  
ans = []  
for i in range(0, 100, 2):  
    for j in range(0, 100, 2):  
        N = 2**i*5**j  
        if 250000000 <= N <= 700000000:  
            ans.append([N, count_del(N)])  
ans = sorted(ans, reverse = True)  
for i in range(len(ans)):  
    print(*ans[i])

Ответ: 655360000 982514930 625000000 925292936 419430400 620756960 400000000 599511206 268435456 268435454 256000000 383972276

Ошибка.
Попробуйте повторить позже

Задача 20#22218

Найдите все натуральные числа, N, принадлежащие отрезку [300 000 000; 500 000 000], которые можно представить в виде N  = 3m ∗ 7n  , где m − нечётное число, n − чётное число. В ответе запишите все найденные числа в порядке возрастания, а справа от каждого числа − сумму m+n. Числа написать в ответ через один пробел.

Показать ответ и решение
ans = []  
for i in range(1, 101, 2):  
    for j in range(0, 100, 2):  
        N = 3**i*7**j  
        if 300000000 <= N <= 500000000:  
            ans.append([N, i+j])  
ans = sorted(ans)  
for i in range(len(ans)):  
    print(*ans[i])

Ответ: 425329947 15
Рулетка
Вы можете получить скидку в рулетке!