Привидения на фабрике.
От: sh24  
Дата: 22.06.04 19:46
Оценка: 20 (3)
Доброе время суток.

Сегодня знакомый предложил задачу, процесс решения которой понравился. Прошу сильное не пинать, если баян )) Итак...

На фабрике работает один миллион рабочих, каждому из которых руководство выделило по персональному ящику. Вечером рабочий день заканчивается, и рабочие идут к своим ящикам, которые пронумерованы с 1 до 1`000`000, складывают в них свои вещи и отправляются домой на заслуженный отдых. Ближе к полуночи из старых цехов, домен, чердаков и т.д. появляются ровно один миллион привидений, решивших немного пошалить. Все они также пронумерованы от 1 до 1`000`000 )) Привидения действуют следующим образом:

1. Первое привидение открывает все ящики наших работяг (т.к. к сожалению, денег на замки для ящиков начальство не предоставило)
2. Привидение с порядковым номером на «груди» «2» закрывает все ящики, номера которых делятся на 2, т.е. закрывает ящики 2, 4, 6, 8 и т.д.
3. Третье привидение с порядковым номером, как мы все догадались, «3» изменяет состояние всех ящиков, которые делятся на 3. Т.е. если номер ящика делиться на 3 и был закрыт, то оно открывает его, если этот ящик был открыт – закрывает. Например, на этом шаге будут закрыты ящики: 3, 9 и открыт ящик за номером 6 и т.д.
N. Все последующие привидения с 4 по 1`000`000-е действую по тому же алгоритму, т.е. изменяют состояние ящиков, порядковые номера которых делятся на их порядковый номер.

Привидения действую быстро и бесшумно до самого утра, пока все не внесут свою лепту в процесс открывания/закрывания ящиков. И вот к утру последнее 1`000`000 привидение изменяет состояние единственного ящика, и все привидения исчезают каждое по своему углу.На утро приходят рабочие и обнаруживают, что часть ящиков открыта, а часть закрыта.

1. Сколько ящиков открыто/закрыто?
2. Как доказать, что именное указанное количество будет открыто/закрыто, без просчета каждого шага?

Вот. Решение простое и красивое.
Re: Привидения на фабрике.
От: Kisl0id  
Дата: 22.06.04 20:43
Оценка:
Есть одна идейка (но не решение) :
Для N = 10.
Рассм. такую матрицу :
1 2 3 4 5 6 7 8 9 10
1 — — — — — — — — — —
2 — — — — —
3 — — —
4 — —
5 — —
6 —
7 —
8 —
9 —
10 —
1 2 2 3 2 4 2 4 3 4 -> кол-во '-'

Дальше приходим к выводу, что кол-во '-' есть кол-во делителей. Если это кол-во чётно, значит дверь закрыта, иначе она открыта. В этом случае 3 открытых и 7 закрытых дверей. Т.е. задачка сводится к вычислению суммы такого ряда :
k = f(1) + f(2) + ... + f(1000000);, где f(i) это ф-я возвр-я кол-во делителей числа i.
Re[2]: Привидения на фабрике.
От: Kisl0id  
Дата: 22.06.04 20:49
Оценка:
Матрица неправильно нарисовалась =(((

Рассм. такую матрицу :
___1_2_3_4_5_6_7_8_9_10
1__+_+_+_+_+_+_+_+_+_+
2____+___+___+___+___+
3______+_____+_____+__
4________+_______+____
5__________+_________+
6____________+________
7______________+______
8________________+____
9__________________+__
10___________________+
___1_2_2_3_2_4_2_4_3_4 -> кол-во '+'

Вроде щас должна правильно отображаться =)
Re[2]: Привидения на фабрике.
От: Kisl0id  
Дата: 22.06.04 20:55
Оценка:
K>Дальше приходим к выводу, что кол-во '-' есть кол-во делителей. Если это кол-во чётно, значит дверь закрыта, иначе она открыта. В этом случае 3 открытых и 7 закрытых дверей. Т.е. задачка сводится к вычислению суммы такого ряда :
K>k = f(1) + f(2) + ... + f(1000000);, где f(i) это ф-я возвр-я кол-во делителей числа i.

Ой опять ошибся =(.
k = f(1)%2 + f(2)%2 + ... + f(1000000)%2; — кол-во открытых дверей.
И соответственно 1000000-k — кол-во закрытых дверей.
Re: Привидения на фабрике.
От: Neo09 Россия  
Дата: 22.06.04 22:11
Оценка: 20 (3)
Здравствуйте, sh24, Вы писали:

S>Доброе время суток.


S>Сегодня знакомый предложил задачу, процесс решения которой понравился. Прошу сильное не пинать, если баян )) Итак...


S>На фабрике работает один миллион рабочих, каждому из которых руководство выделило по персональному ящику. Вечером рабочий день заканчивается, и рабочие идут к своим ящикам, которые пронумерованы с 1 до 1`000`000, складывают в них свои вещи и отправляются домой на заслуженный отдых. Ближе к полуночи из старых цехов, домен, чердаков и т.д. появляются ровно один миллион привидений, решивших немного пошалить. Все они также пронумерованы от 1 до 1`000`000 )) Привидения действуют следующим образом:


S>1. Первое привидение открывает все ящики наших работяг (т.к. к сожалению, денег на замки для ящиков начальство не предоставило)

S>2. Привидение с порядковым номером на «груди» «2» закрывает все ящики, номера которых делятся на 2, т.е. закрывает ящики 2, 4, 6, 8 и т.д.
S>3. Третье привидение с порядковым номером, как мы все догадались, «3» изменяет состояние всех ящиков, которые делятся на 3. Т.е. если номер ящика делиться на 3 и был закрыт, то оно открывает его, если этот ящик был открыт – закрывает. Например, на этом шаге будут закрыты ящики: 3, 9 и открыт ящик за номером 6 и т.д.
S>N. Все последующие привидения с 4 по 1`000`000-е действую по тому же алгоритму, т.е. изменяют состояние ящиков, порядковые номера которых делятся на их порядковый номер.

S>Привидения действую быстро и бесшумно до самого утра, пока все не внесут свою лепту в процесс открывания/закрывания ящиков. И вот к утру последнее 1`000`000 привидение изменяет состояние единственного ящика, и все привидения исчезают каждое по своему углу.На утро приходят рабочие и обнаруживают, что часть ящиков открыта, а часть закрыта.


S>1. Сколько ящиков открыто/закрыто?

S>2. Как доказать, что именное указанное количество будет открыто/закрыто, без просчета каждого шага?

S>Вот. Решение простое и красивое.


Ну сразу понятно, что ящик будет открытым, если количество делителей нечетно и закрыта, если четно.
А нечетное количество делителей только у полных квадратов, т.к. для каждого делителя(K) числа(N) существует другой делитель(M = N / K) этого числа, которые в произведении дают N. Но только у полных квадратов для делителя K = sqrt(N) соответствует число M = K, т.е. количество делителей нечетно.

Число открытых ящиков будет равно количеству полных квадратов в отрезке [1, N], что для нашего примера равно 1000.
Re[2]: Привидения на фабрике.
От: Neo09 Россия  
Дата: 22.06.04 23:32
Оценка:
N>Число открытых ящиков будет равно количеству полных квадратов в отрезке [1, N], что для нашего примера равно 1000.

Забыл самое главное: количество закрытых ящиков будет равно 1000000 — 1000 = 999000

А если обобщить задачу, то если нам дано N ящиков, то после вот этого процесса открытых ящиков будет A = sqrt(N), округленное в нижнюю сторону, а закрытых B = N — A.
Re: Привидения на фабрике.
От: Кодт Россия  
Дата: 23.06.04 08:51
Оценка:
Здравствуйте, sh24, Вы писали:

S>Сегодня знакомый предложил задачу, процесс решения которой понравился. Прошу сильное не пинать, если баян ))


Ты зналь, ты зналь!

http://rsdn.ru/Forum/?mid=83642
Автор: fAX
Дата: 11.08.02
Перекуём баги на фичи!
Re[2]: Привидения на фабрике.
От: sh24  
Дата: 23.06.04 15:44
Оценка:
Здравствуйте, Кодт, Вы писали:

S>>Сегодня знакомый предложил задачу, процесс решения которой понравился. Прошу сильное не пинать, если баян ))

К>Ты зналь, ты зналь!

Да нет... не зналь , и поиск как-то не помог ((

К>http://rsdn.ru/Forum/?mid=83642
Автор: fAX
Дата: 11.08.02


Что ж, извиняйте. Вот оно как за 2 то года все переделывается. ))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.