Страниц: [1] 2
  Печать  
Автор Тема: Программистская.  (Прочитано 4878 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sirion
Гений-Говорун
*
Offline Offline

Сообщений: 1095

СПАСИБО
-вы поблагодарили: 137
-вас поблагодарили: 278



Просмотр профиля Email
: Сентябрь 30, 2011, 19:19:35 �

Суть задачи такова: представим, что нам нужно написать программу, которая последовательно считывает с клавиатуры n целых чисел (каждое из которых не меньше единицы и не больше n) и определяет, являются ли они перестановкой чисел от 1 до n. Число n известно заранее, до написания программы.

Обычно такое пишется довольно просто. Можно, например, взять массив из n элементов, заполнить его нулями, а затем, считав число, присваивать соответствующему элементу единичку. Если в итоге все элементы стали единичными - значит, перестановка. Нет - значит нет.

Но тут нас поджидает засада: у нас ограничена память. У нас есть только две переменные типа unsigned short (принимающих значения от 0 до 216-1), причём одна из них используется как счётчик цикла, и ничего другого мы с ней сделать не можем.

Как нам проверить, являются ли введённые числа перестановкой? И для какого максимального N мы сможем это сделать?
Записан

sirion=irion+srion+rion+siion+iion+sion+ion+siron+iron+sron+ron+sion+ion+son+on+sirin+
+irin+srin+rin+siin+iin+sin+in+sirn+irn+srn+rn+sin+in+sn+n+sirio+irio+srio+rio+siio+
+iio+sio+io+siro+iro+sro+ro+sio+io+so+o+siri+iri+sri+ri+sii+ii+si+i+sir+ir+sr+r+si+i+s
buka
Гений
*****
Offline Offline

Сообщений: 960

СПАСИБО
-вы поблагодарили: 4
-вас поблагодарили: 120



Просмотр профиля
Ответ #1 : Сентябрь 30, 2011, 20:49:21 �

1. В принципе, если суммировать числа в виде к^к, то сумма будет уникальной, но много не насуммируешь Smiley
2. Я подумаю или можно просуммировать кубы. По теореме Ферма сумма двух кубов никогда не даст третий. Но может ли сумма каких-то к кубов быть равна сумме к других кубов - не знаю...
3. В принципе можно суммировать в виде (n-k)*nk-1. Тогда сумма в n-ичной системе счисления будет: 012345...(n-2)(n-1) и надо найти максимальное n, если эта сумма < 216
Вопрос - или нельзя найти что-то компактнее чем п.1 или п.3...
Последнее редактирование: Сентябрь 30, 2011, 21:12:19 от buka Записан
moonlight
Умник
****
Offline Offline

Сообщений: 741

СПАСИБО
-вы поблагодарили: 19
-вас поблагодарили: 232


Просмотр профиля Email
Ответ #2 : Октябрь 01, 2011, 14:02:47 �

Можно 27. Если больше то это очень интересно.
Записан

Зачем откладывать на завтра то, что можно отложить на послезавтра?
moonlight
Умник
****
Offline Offline

Сообщений: 741

СПАСИБО
-вы поблагодарили: 19
-вас поблагодарили: 232


Просмотр профиля Email
Ответ #3 : Октябрь 01, 2011, 16:19:10 �

В условии сказано что одна из переменных используется как счётчик цикла и больше с ней мы сделать ничего не можем. Я на это не обратил внимание и на цикл взял из неё 5 бит а остальные 11 вместе с 16 из второй переменной использовал для записи единичек. Если этого делать нельзя то решение отменяется. Но в этом случае непонятно зачем переменная цикла имеет тип unsigned short.   
Записан

Зачем откладывать на завтра то, что можно отложить на послезавтра?
buka
Гений
*****
Offline Offline

Сообщений: 960

СПАСИБО
-вы поблагодарили: 4
-вас поблагодарили: 120



Просмотр профиля
Ответ #4 : Октябрь 02, 2011, 01:13:21 �

В принципе можно суммировать в виде 2k-1
Это эквивалентно установке в 1 k-ого бита (что по-видимому имел в виду moonlight).
Тогда для 16-и разрядного числа можно иметь 16 чисел - от одного до 16.
Есть ли возможность бОльшей компактности?
В принципе если не ограничивать размер самой программы - то можно Smiley
Можно вообще обойтись без ячеек, построив n! ветвей программы,  Smiley но это уже будет безобразие, конечно Злой
Последнее редактирование: Октябрь 02, 2011, 01:15:10 от buka Записан
moonlight
Умник
****
Offline Offline

Сообщений: 741

СПАСИБО
-вы поблагодарили: 19
-вас поблагодарили: 232


Просмотр профиля Email
Ответ #5 : Октябрь 02, 2011, 08:07:02 �

По теореме Ферма сумма двух кубов никогда не даст третий. Но может ли сумма каких-то к кубов быть равна сумме к других кубов - не знаю...
таких вариантов очень много.
например 13 + 23 + 43 + 83 + 93 + 123  =  33 + 53 + 63 + 73 + 103 + 113
Записан

Зачем откладывать на завтра то, что можно отложить на послезавтра?
zhekas
Гений-Говорун
*
Offline Offline

Сообщений: 1035

СПАСИБО
-вы поблагодарили: 34
-вас поблагодарили: 487



Просмотр профиля Email
Ответ #6 : Октябрь 02, 2011, 10:53:22 �

Вопрос в том насколько ограничена n. Если n - ограничена только типом переменной, то всё вышепредложенное не работает
Записан
moonlight
Умник
****
Offline Offline

Сообщений: 741

СПАСИБО
-вы поблагодарили: 19
-вас поблагодарили: 232


Просмотр профиля Email
Ответ #7 : Октябрь 02, 2011, 20:03:37 �

Есть такой вариант.
N=11.
Находим сумму значений f(n)=n4+4n3+6n2+6n.
Сумма 60830 получается только если все n различны.
Записан

Зачем откладывать на завтра то, что можно отложить на послезавтра?
zhekas
Гений-Говорун
*
Offline Offline

Сообщений: 1035

СПАСИБО
-вы поблагодарили: 34
-вас поблагодарили: 487



Просмотр профиля Email
Ответ #8 : Октябрь 02, 2011, 20:06:39 �

Есть такой вариант.
N=11.
Находим сумму значений f(n)=n4+4n3+6n2+6n.
Сумма 60830 получается только если все n различны.

а если n порядка 2^16
Записан
General
Умник
****
Offline Offline

Сообщений: 681

СПАСИБО
-вы поблагодарили: 47
-вас поблагодарили: 164



Просмотр профиля
Ответ #9 : Октябрь 03, 2011, 20:38:22 �

А что если этой переменной делать xor (счётчик xor  введённое число)?
Записан

5 Головоломок | //текст доступен после регистрации//
General
Умник
****
Offline Offline

Сообщений: 681

СПАСИБО
-вы поблагодарили: 47
-вас поблагодарили: 164



Просмотр профиля
Ответ #10 : Октябрь 04, 2011, 16:09:03 �

Ведь и вправду! (честно, раньше эта задача мне не встречалась). Операция xor коммуникативна и ассоциативна. И, т.к. n xor n = 0, то номера и введённые числа должны себя взаимно уничтожить, если введённые числа являются перестановкой номеров и переменная 2 обратится в 0.
Записан

5 Головоломок | //текст доступен после регистрации//
Sirion
Гений-Говорун
*
Offline Offline

Сообщений: 1095

СПАСИБО
-вы поблагодарили: 137
-вас поблагодарили: 278



Просмотр профиля Email
Ответ #11 : Октябрь 04, 2011, 16:28:05 �

контрпример
n=5, ввод: 3,3,3,3,1
Записан

sirion=irion+srion+rion+siion+iion+sion+ion+siron+iron+sron+ron+sion+ion+son+on+sirin+
+irin+srin+rin+siin+iin+sin+in+sirn+irn+srn+rn+sin+in+sn+n+sirio+irio+srio+rio+siio+
+iio+sio+io+siro+iro+sro+ro+sio+io+so+o+siri+iri+sri+ri+sii+ii+si+i+sir+ir+sr+r+si+i+s
General
Умник
****
Offline Offline

Сообщений: 681

СПАСИБО
-вы поблагодарили: 47
-вас поблагодарили: 164



Просмотр профиля
Ответ #12 : Октябрь 04, 2011, 17:31:33 �

Действительно... Спасибо, подумаю. Но наверняка побитовые операции вовлечены.
Записан

5 Головоломок | //текст доступен после регистрации//
Sirion
Гений-Говорун
*
Offline Offline

Сообщений: 1095

СПАСИБО
-вы поблагодарили: 137
-вас поблагодарили: 278



Просмотр профиля Email
Ответ #13 : Октябрь 04, 2011, 18:11:32 �

кстати, чуть не проглядел
Операция xor коммуникативна
хоть не коммуникабельна))
Записан

sirion=irion+srion+rion+siion+iion+sion+ion+siron+iron+sron+ron+sion+ion+son+on+sirin+
+irin+srin+rin+siin+iin+sin+in+sirn+irn+srn+rn+sin+in+sn+n+sirio+irio+srio+rio+siio+
+iio+sio+io+siro+iro+sro+ro+sio+io+so+o+siri+iri+sri+ri+sii+ii+si+i+sir+ir+sr+r+si+i+s
General
Умник
****
Offline Offline

Сообщений: 681

СПАСИБО
-вы поблагодарили: 47
-вас поблагодарили: 164



Просмотр профиля
Ответ #14 : Октябрь 04, 2011, 20:37:20 �

ой, тьфу, коммутативна, конечно же
Записан

5 Головоломок | //текст доступен после регистрации//
Страниц: [1] 2
  Печать  
 
Перейти в: