Имя: Пароль:
IT
 
Старый клен, старый клен, старый клен стучит в окно...
0 Злопчинский
 
24.12.12
03:25
Рассмотрим задачу.
Дано:
Есть 1000 окон и 1000 человек.
1 человек приводит все окна в исходное состояние - закрывает
после этого:
2 человек меняет состояние каждого второго окна на противоположное
после этого
3 человек меняет состояние каждого третьего окна на противоположное
после этого
4 человек меняет состояние каждого четвертого окна на противоположное
и т.д. до последнего человека.
.
Требуется:
после того как все человеки выполнили действия - определить сколько окон будет закрыто/скольо открыто.
.
Задачу решили но как-то не сильно строго - четкой математической базы не подвели...
.
ДРУГАЯ ФОРМУЛИРОВКА (мне кажется, более простая): количество инверсий ячейки - это количество натуральных чисел, на которые номер ячейки делится нацело (без остатка), без учёта единицы.
.
Например, 36 делится нацело на числа 2, 3, 4, 6, 9, 12, 18, 36 (число 1 отбрасываем). Таким образом, ячейка номер 36 будет проинвертирована 8 раз, и её конечное состояние будет эквивалентно исходному (будет нуль).
.
Таким образом, нужно посчитать количество натуральных чисел, меньших 1000, которые представимы в виде квадратов других натуральных чисел. Легко увидеть, что таких чисел 31. 31^2=969, а уже 32^2=1024.
.
Итого при таким образом сформулированной задаче ответ получится:
31 нулей
969 единиц
.
но вот как-то.. мучают сомнения...
.
спасибо.
1 1Сергей
 
24.12.12
09:22
Сомневаешься? Проверь!
2 Dmitry77
 
24.12.12
09:33
напиши программу - всего то 2 цикла. И вывод этой ТЗ.
3 napagokc
 
24.12.12
09:36
эмм...? Задачка же решается одним циклом на любом языке программирования. В чем сомнения-то?
4 Dmitry77
 
24.12.12
09:37
(3) пример приведи с одним циклом. Можно на 1с.
5 Serg_1960
 
24.12.12
09:47
(0) Один добрый человек закрыл все окна (исходное состояние).
Потом два придурка "меняют состояние" - первый из них открывает окно, а второй следом за ним закрывает это-же окно... Поднедельник, утро - не я один так дико торможу и это радует :)
6 napagokc
 
24.12.12
10:23
const
 max = 1000;
var
 i, j: Integer;
 a: array [1..max] of boolean;
begin
 for i := 1 to max do
   a[i] := False;
 for i := 2 to max do begin
   j := 0;
   while j < max do begin
     j := j + i;
     a[j] := not a[j];
   end;
 end;
 j := 0;
 for i := 1 to max do
   if a[i] then
     Inc(j);
 ShowMessage('TRUE = '+IntToStr(j));
end;

выдает 969, (0) все правильно вычислил
7 napagokc
 
24.12.12
10:24
только, наверное,
while j <= max do

но суть не изменилась :)
8 1Сергей
 
24.12.12
10:25
(6) это ты называешь одним циклом?
9 napagokc
 
24.12.12
10:27
(8) Ну, двойной цикл получился, угу :) Еще два цикла - один для инициализации, а другой для отделения уже нужного результата. Все равно задача на 5 минут
10 Злопчинский
 
24.12.12
11:44
написать не проблема, написано уже
.
//*******************************************
Процедура Сформировать()
   
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Переключатель","Число");
   ТЗ.КоличествоСтрок(1000);
   ТЗ.Заполнить(0,1,1000,"Переключатель");
   
   Для    ы=2 по 1000
   Цикл
       Сообщить(ы);
       ыы = 0;
       Пока ыы <= (1000-ы)
       Цикл
           ыы = ыы+ы;
           ТЗ.ПолучитьСтрокуПоНомеру(ыы);
           ТЗ.Переключатель = 1-ТЗ.Переключатель;
       КонецЦикла;    
   КонецЦикла;
   
   Сообщить(ТЗ.Итог("Переключатель"));    
   ТЗ.ВидимостьКолонки("НомерСтроки",1);
   ТЗ.ВыбратьСтроку(,);
КонецПроцедуры
11 Злопчинский
 
24.12.12
11:45
решить нужно математически. решение тупое в лоб перебором - это не правильно.
12 1Сергей
 
24.12.12
11:54
(11) решение ведь в (0). Не?
13 Злопчинский
 
24.12.12
11:55
(12) не знаю, как-то не удалось его сложить связно...
14 lepesha
 
24.12.12
12:14
(0) Вы там теорему Лагранжа пытаетесь опровергнуть?
"Всякое натуральное число можно представить в виде суммы четырех квадратов целых чисел."
wiki:Теорема_Лагранжа_о_сумме_четырёх_квадратов
Так что "количество натуральных чисел, меньших 1000, которые представимы в виде квадратов других натуральных чисел" таки равно тысяче :)
15 Злопчинский
 
24.12.12
14:32
(14) ненене... так высоко мы не замахиваемся! надо всего лишь решить задачу в сабже
16 Жан Пердежон
 
24.12.12
15:10
31^2=961
17 Злопчинский
 
24.12.12
15:12
(16) до этого мы и сами как-то дошли, но вот ОБОСНОВАТь....
18 Deon
 
24.12.12
15:15
(10) И почему все тру-программеры обожают переменные ыы, жж, гг, ёё...
19 НикДляЗапросов
 
24.12.12
15:18
Ну я так понимаю через пределы решается
20 acsent
 
24.12.12
15:20
Не понял перехода:
Таким образом, нужно посчитать количество натуральных чисел, меньших 1000, которые представимы в виде квадратов других натуральных чисел. Легко увидеть, что таких чисел 31. 31^2=969, а уже 32^2=1024.
21 sda553
 
24.12.12
15:41
Каждое число есть разложение на простые числа, такое разложение единственное:
Например 1000 = 2*2*2*5*5*5
Очевидно что количество инверсий, равно количеству различных чисел которое можно составить из 6-ти этих. Т.е. для 1000 это будет
2 (каждое второе окно)
5 (каждое пятое)
2*2 (кажде 4-е окно)
2*5
5*5
2*2*2
2*2*5
2*5*5
5*5*5
2*2*2*5
2*2*5*5
2*5*5*5
2*2*2*5*5
2*2*5*5*5
2*2*2*5*5*5

Итого 15 инверсий.
Т.к. разложение единственное, то для решения задачи достаточно сделать 10 ячеек (2^10>1000, так что достаточно)
и начинать ставить в этих 10-ти ячейках все возможные сочетания простых чисел от 2 до 499 (таких чисел 95), естественно в возрастающем порядке, чтобы избежать повторов.
При этом, правда получаться числа и >1000.
22 lepesha
 
24.12.12
17:48
Почему бы не посчитать количество чисел от 2 до 1000, имеющих четное количество делителей без остатка в интервале от 2 до 1000?
23 Злопчинский
 
24.12.12
18:10
(20) если не понял - не заморачивайся - это размышления так сказать в качестве дежурного бреда
24 Злопчинский
 
24.12.12
18:10
(21) количество ячеек в задаче ЗАДАНО ИСХОДНО.
25 Злопчинский
 
24.12.12
18:12
(21) 15 инверсий - ничего не дает. сколько при твоем решении будет открытх окон и скольо закрытых из 1000..?
26 sda553
 
24.12.12
22:11
(25) Это дает что тысячное окно будет открыто и закрыто 15 раз
(24) Нет, не задано, ты меня не понял, скорее всего.
27 Злопчинский
 
24.12.12
22:57
(26) количество ОКОН - задано исходно. Важно не сколько раз открыто/закрыто будет окно. а в конечном итоге - скольо окон будет закрыто/открыто ИЗ ЗАДАННОГО ИСХОДНОГО КОЛИЧЕСТВА.
.
количество людей = количеству окон.
28 sda553
 
24.12.12
23:07
(27) Я же говорю, что ты меня не понял. Ячейки в моем решении <> окна
29 sda553
 
24.12.12
23:09
(27) Завтра выложу какое нибудь законченное решение, попробую
30 Юрий Лазаренко
 
24.12.12
23:10
(0) Мне кажется или это драконова кривая? или как там она называется.
31 sda553
 
25.12.12
00:08
Блин, все резко упрощается.
Итак
1. Каждое окно инвертируется столько раз, сколько у его номера по счету существует различных (не обязательно простых) делителей.
например у окна 10, делители 1,2,5,10 а значит оно инвертируется 4 раза.
Теперь обратим внимание. Раз число 10 делится на 2, то логично, что оно делится и на 10/2, т.е. на 5.
Или вообщем если число n делится на m, то оно делится и на n/m.

А значит, у любого целого n числа всегда ЧЕТНОЕ число делителей, так как у каждого делителя m существует делитель n/m, кроме тех чисел у которых есть такой делитель m, что n/m равно самому m.
Рассмотрим внимательнее теперь числа n для которых существует m, что n/m=m,  
очевидно, что n=m^2,  а знчит эти числа, квадраты натуральных чисел. А у них НЕЧЕТНОЕ число инверсий.
Ну а дальше все элементарно
32 lepesha
 
25.12.12
01:21
(31) "Или вообщем если число n делится на m, то оно делится и на n/m." - и что вам даст n/n*m? И как вы пришли к выводу о четном числе делителей? Дирихле с вами не согласен :)
33 Злопчинский
 
25.12.12
01:39
наблюдаю.
кто даст законченный вывод?
34 sda553
 
25.12.12
06:55
(32) как раз первая часть вашего предложения дает то, что во второй части приложения.
Если для каждого ботинка есть парный ботинок, то мы имеем четное число ботинков, так?
Меняем слова:
Если для каждого делителя m есть парный делитель n/m, то мы имеем четное число делителей.
35 lepesha
 
25.12.12
09:05
(34) Попробую объяснить проще - перемножьте любое нечетное количество членов ряда простых чисел.
36 sda553
 
25.12.12
10:10
(35)
Ок, берем нечетное количество простых чисел, например 2,3,5
Перемножаем, получаем число 2*3*5=30
Теперь посмотрим сколько делителей у числа 30, а они вот
1,2,3,5,6,10,15,30.
Т.е. восемь делителей.
В чем вопрос?
37 lepesha
 
25.12.12
11:05
(36) Пробуйте еще.
38 lepesha
 
25.12.12
11:13
Например с числами 4, 9, 16, 25.
39 sda553
 
25.12.12
11:35
(38) у них будет нечетное число делителей.
Смотри внимательно (31)
У любого целого числа n всегда четное число делителей,..... КРОМЕ ТЕХ ЧИСЕЛ....
Теперь я все решение (31) разжевал? Или еще вопросы
40 lepesha
 
25.12.12
13:38
(39) Смотрел невнимательно, поэтому нечетное количество делителей у полных квадратов в формулировке не увидел. Теперь все ОК :)
41 Злопчинский
 
26.12.12
18:04
(39) Есть "или еще вопросы". Приведите конкретное решение для варианта 1000 окон и 1000 людей.
.
спсб!
42 sda553
 
27.12.12
12:45
(41) С учетом (31) все окна порядковые номера которых являются квадратами будут закрыты.
Это окна с номерами: 1^2; 2^2; 3^2; ...., 31^2
Остальные открыты.
Значит 31 закрытое и 969 открытых
43 Vladal
 
27.12.12
13:20
(10) [code]Для    ы=2[/code]

Я думал, что один такой, когда пишу [code]Для ъ=2[/code]
44 Vladal
 
27.12.12
13:23
(18) Так не ошибешься)))
В каком-то учебнике по программированию писали стандарт по переменным, что вспомнил: для счетчикв циклов использовать переменные с именем i,j,k,l, для произвольных целых - a,b
Точно уже не помню.
45 Undefined vs NULL
 
29.12.12
09:48
решение в (31), а я в отпуске ))
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn