Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Абрамов С.А., Гнездилова Г.Г., Капустина Е.Н., Селюн М.И. Задачи по программированию [pdf]

.pdf
Скачиваний:
740
Добавлен:
02.05.2014
Размер:
6.04 Mб
Скачать

Даны натуральные числа k, l, m (k ≤ l). Проверить, верно ли, что для любого натурального числа из диапазона от k до l процесс завершается не позднее, чем после m таких действий.

565. Рассмотрим некоторое натуральное число n (n > 1). Если оно четно, то разделим его на 2, иначе умножим на 3 и прибавим 1. Если полученное число не равно 1, то повторяется то же действие и т. д., пока не получится 1. До настоящего времени неизвестно, завершается ли этот процесс для любого n > 1.

Даны натуральные числа k, l, m (1 < k l ). Проверить, верно ли, что для любого натурального n из диапазона от k до l процесс завершается не позднее, чем после m таких действий.

566. Найти все простые несократимые дроби, заключенные между 0 и 1, знаменатели которых не превышают 7 (дробь задается двумя натуральными числами – числителем и знаменателем).

567.Дано натуральное число n. Выяснить, можно ли представить n! в виде произведения трех последовательных целых чисел.

568.Дано натуральное число m. Вставить между некоторыми цифрами 1, 2, 3, 4, 5, 6, 7, 8, 9 записанными именно в таком порядке, знаки +, – так, чтобы значением получившегося выражения было число m. Например, если m=122, то подойдет следующая расстановка знаков: 12 + 34 – 5 – 6 + 78 + 9. Если требуемая расстановка знаков невозможна, то сообщить об этом.

569.Дано натуральное число n. Получить в порядке возрастания n первых натуральных чисел, которые не делятся ни на какие простые числа, кроме 2, 3 и 5.

570.Алгоритм Евклида (см. задачу 89) допускает многочисленные обобщения. Например, вместе с НОД (f, g) можно вычислять целые u и v такие, что fu + gv = НОД (f, g). Это дает

возможность находить некоторое целочисленное решение уравнения вида kx + ly = m, где k, l, m – целые числа такие, что k и l одновременно не равны 0, а m делится на d = НОД(|k|, |l|). Пусть |k|u + |l|v = d; тогда

|k|um/d + |l|vm/d = m и, как следствие этого, k(c1um/d) + l(c2vm/d) = m,

где c j = ± 1 (j = 1, 2). Укажем алгоритм нахождения целых чисел u и v,

удовлетворяющих fu+gv=НОД(f, g). Обозначим временно f через f0 и g через f1. Получаемые в процессе применения алгоритма Евклида ненулевые остатки обозначим через f2, …, fn, частные от деления f0 на f1, fl на f2, , fn-1 на fn – через а1, а2, ..., аn:

f0 = a1 f1 + f2 , f1 = a2 f2 + f3 ,

........................,

fn2 = an1 fn1 + fn , fn1 = an fn ;

здесь НОД(f0, f1) = fn. Пусть для некоторого i n 2 вместе с числами fi, fi+1 известны соответствующие им множители p, q, s, t такие, что f0p + f1q = fi, f0s + f1t = fi+1. Тогда, разделив fi на fi+1 и получив частное ai+1, и остаток fi+2, мы можем вычислить множители, соответствующие fi+2: так как fi – ai+1fi+1 = fi+2, то f0(pai+1s) + f1(q–ai+1t) = fi+2.

Таким образом, для нахождения целых u и v таких, что fu+ gv = НОД(f, g), надо применять к f и g алгоритм Евклида,

рассматривая на каждом шаге его применения, кроме тех двух чисел, которые рассматривались и прежде, еще и соответствующие этим числам множители p, q и s, t. На первом шаге в качестве множителей, соответствующих исходным числам f и g берутся 1,0 и 0,1. Выполнив деление и получив частное a и некоторый остаток, надо, если остаток не равен 0, вычислить по формулам p–as, q–at множители, соответствующие полученному остатку. Множители, соответствующие

последнему ненулевому остатку, дадут решение рассматриваемого уравнения fu + gv = НОД(f, g).

а) Даны одновременно не равные 0 целые f и g. Найти НОД(|f|, |g|) и целые u и v, такие, что fu + gv = НОД(|f|, |g|).

б) Даны целые k, l, m такие, что k и 1 одновременно не равны 0, а m делится на НОД(|k|, |l|). Найти какое-нибудь целочисленное решение уравнения kx + ly = m.

в) Заметим, что предложенный выше алгоритм поиска множителей u и v можно изменить так, что число требуемых им операций сократится почти в полтора раза: из двух чисел u и v достаточно вычислить вместо НОД(f, g) только v, а затем определить u по формуле u = (НОД(f, g) – gv)/f. Внести это усовершенствование в программы, дающие решения заданий а), б).

571. Показать, что если х1, у1 и х2, у2 – два целочисленных решения уравнения kx + ly = m, то х1 – x2, y1 y2 – целочисленное

решение уравнения kx + ly = 0. Вывести отсюда, что если x, y – какое-

нибудь целочисленное решение уравнения kx + ly = m, то все целочисленные решения этого уравнения описываются формулами

x =

x +

lt,

y = y k t , где k = k/НОД(k, l), l= l/НОД(k, l)

t =

(0, ±

1, ±

2, ...) . Написать программу, которая позволяет проверить,

обладает ли уравнение kx + ly = m решением в целых неотрицательных числах, и если обладает, то позволяет построить какое-то одно такое решение.

572. Даны натуральное число k, одновременно не равные 0 целые числа n1, …, nk. Найти НОД(|n1|, …, |nk|) и целые u1, …, uk такие, что u1n1 + … + uknk = НОД(|n1|, …, |nk|) (см. задачу 333).

573. Даны натуральные взаимно простые числа n, p. Используя алгоритм, описанный в задаче 570а, найти натуральное m такое, что, во-первых, m < p и, во-вторых -nm при делении на р дает остаток 1.

574. Известная в теории чисел китайская теорема об остатках утверждает следующее. Пусть p1, …,pr – попарно взаимно простые натуральные числа; пусть v = р1...рr. Пусть а1, ..., аr, – такие целые неотрицательные числа, что а1 < p1, …, ar < pr. Тогда существует ровно одно целое неотрицательное u < v, которое при делении на р1, дает остаток а1, при делении на р2, дает остаток а2, …, при делении на рr, дает остаток аr. (Процесс восстановления числа по его остаткам был известен в Китае уже около 2000 лет назад, поэтому теорема и имеет такое название.) Если даны р1, ..., рr, а1, ..., аr то на основании этой теоремы число u может быть найдено последовательной проверкой чисел 0, 1, ..., v – 1. Однако есть алгоритм значительно более быстрого решения этой задачи, который мы сформулируем без доказательства (имеет смысл попытаться самостоятельно найти доказательство).

Обозначим через vi (1i r) произведение всех рi, ..., рr кроме

рi, т.е. vi = р1рi-1рi+1рr = v/pi. Пусть числа wi (1i r) таковы, что

1≤ wi < pi и vi wi при делении на рi дает остаток 1 (см. предыдущую задачу). Тогда можно положить u равным остатку от деления v1w1a1 + … + vrwrar на v. Например, если р1, р2, р3, р4 равно

соответственно 2, 3, 5, 7, а а1, а2, а3, а4 равны соответственно 1, 2, 4, 3, то получится u = 59. Проверка показывает, что u удовлетворяет условию задачи: 59 < 2 3 5 7 , 59 = 2 29 + 1 = 3 19 + 2 = 5 11+ 4 = 7 8 + 3 .

Даны натуральные числа r, р1, ..., рr, целые неотрицательные числа а1, …, аr, (p1, …, pr – попарно взаимно простые, а1 < p1, …, ar < pr ). Найти u, удовлетворяющие сформулированным выше условиям.

575. Цепной дробью (конечной) называется выражение

1

b1 + b2 +1...1 1

bk

где b1, ..., bk – натуральные числа. Для цепной дроби такого вида используют краткую запись [b1, b2, ..., bk]. Каждое положительное, меньшее единицы рациональное число s/t можно представить цепной дробью. Пусть s, t – натуральные числа (s < t). После деления t на s с

остатком получается, что t = аs + r,

(a >

0, 0 ≤ r < s) , откуда

 

s

=

1

=

1

.

 

t

t s

 

a +

r s

 

 

 

 

 

Полагаем b1 = а, затем этим же способом преобразуем r/s и получаем b2, и т.д. Видно, что b1, …, bk – это последовательность частных, возникающих в процессе применения к s и t алгоритма Евклида (см.

задачу 89). Итак, пусть s/t = [b1, …, bk]. Дополнительно рассмотрим цепные дроби [b1], [b1, b2], ..., [b1, …, bk-1], значения которых называются подходящими дробями числа s/t. Обозначим несократимые формы подходящих дробей через p1/q1, ..., pk-1/qk-1. Подходящие дроби обладают следующими важными свойствами:

1)

s

pi

<

1

, i = 1, …, k – 1;

t

q

q2

 

 

 

 

 

 

 

i

 

i

 

2) если для некоторой дроби u/v и подходящей дроби pi qi

выполнено

s

u

<

s

pi

,

t

v

t

q

 

 

 

 

 

 

 

 

 

 

i

 

то v>qi.

Свойства 1), 2) используются в решении разнообразных практических задач, требующих подбора для данного рационального