|
|
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Здарова челы! Сори за боян и олимпиаду. В смежном топике ботаны увлеклись сравнением чисел астрономической разрядности (дай бох им всем здоровья) а мы тут будем колбасить теплые "ламповые операции". OK! Let is go! Задача. http://acmp.ru/index.asp?main=task&id_task=337 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 01:19 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
mayton, но ведь суббота! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 02:14 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
В принципе решается тупым перебором, но вот уложится ли он в 2 секунды - не уверен. Точнее, при фактических входных данных, конечно, уложится, а вот при количестве лампочек ближе к 10 9 - уже вряд ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 02:32 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Считаем от 1 до N, каждый шаг проверяем на какое количество P i делится нацело. Если нечетное "итого+1" дальше оптимизация: разложение на простые, поиск минимального шага цикла, поиск одинаковых интервалов и т.д. и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 07:22 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
НОД(P) это шаг цикла НОК(P) предел цикла, дальше он повторяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 07:30 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
В массиве P много повторов (100 элементов <50). Все задвоения надо просто выкинуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 07:35 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Чтобы не делить, проще использовать К счетчиков каждый со своим шагом Р: нашли минимум, посчитали кол-во счетчиков равных минимуму, нечетное - "итого+1", каждый счетчик в минимуме увеличить на Р и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 09:03 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Пока есть мысль что некоторые кратные инверсии типа 2:4 можно соптимизировать и учесть заранее. Два на четыре это тоже самое что четыре но со "сдвигом". Есть также мысль проверять взаимную простоту чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 13:36 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Входные данные nLamps = 1000000000; nInversions = 10; Periods = new int[]{19,2,7,13,40,23,16,1,45,9}; Результат Time elapsed: 00:00:05.2807186 Lamps = 525373291. Press any key to continue . . . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 17:30 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
maytonБиткарта? Точно. Забыл выкинуть лишнее. Поправил =) Time elapsed: 00:00:00.6150498 Lamps = 525373291. Press any key to continue . . . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 18:16 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
SiemarglВходные данные nLamps = 1000000000; nInversions = 10; Periods = new int[]{19,2,7,13,40,23,16,1,45,9}; Результат Time elapsed: 00:00:05.2807186 Lamps = 525373291. Press any key to continue . . . 1. Выкинь единицы. Просто добавь флаг инверсия результата. Т.е. вместо количество нечетных - кол-во четных. 2. Считай до НОК, это примерно 50 млн., дальше все повторяется. Например счетчики 4 и 5: НОК 20, внутри 20 (4,5,8,10,12,15,16, 20) 8 ламп. В миллиарде 8 * 1000000000 / 20 = 400000000. Не забудь что остаток может быть: например НОК = 30, предел 100, т.е. результат = (цикл до 30) * 3 + (цикл до 10). 3. Деление убрал? mayton, для биткарты 16 Мб не хватит. PS Вообще некогда, попозже, если успею - напишу. Но вроде все очень просто. Я основные детали алгоритма выше уже изложил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 18:18 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Про шаг 1 наврал, надо считать без него, а потом инверсия "итого = всего - итого" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 18:45 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima Tmayton, для биткарты 16 Мб не хватит. PS Вообще некогда, попозже, если успею - напишу. Но вроде все очень просто. Я основные детали алгоритма выше уже изложил. Думаю что в этом весь цимес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 19:02 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Да, цимес имеется. У меня на сайтике стабильно заваливается 7й тест - если биткарта, то 2с мне нехватает, если без биткарты - то завал по памяти ( Переписывать на С++ не хочу. В общем с биткартой на данных ниже у меня nLamps = 1000000000; nInversions = 10; Periods = new int[]{19,2,7,13,40,23,16,1,45,9}; Time elapsed work+count: 00:00:01.2806298 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 19:16 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
SiemarglУ меня на сайтике стабильно заваливается 7й тест Написал. так же 7. Wrong answer. Есть какая-то комбинация в условиях которую не учли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 20:23 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
SiemarglПереписывать на С++ не хочу. на C# используй структуры (struct вместо class), будет близко по скорости к c++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 20:36 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TSiemarglПереписывать на С++ не хочу. на C# используй структуры (struct вместо class), будет близко по скорости к c++ а есть, вообще, готовый пример, показывающий что сортировка структур идет быстрее сортировки классов? Или это религиозная догма. Пытался както померять скорость на структурах и на классах - разницы не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 20:38 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TSiemarglУ меня на сайтике стабильно заваливается 7й тест Написал. так же 7. Wrong answer. Есть какая-то комбинация в условиях которую не учли. Например, число в данных встречается дважды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 20:45 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TЕсть какая-то комбинация в условиях которую не учли. Попробуйте такое: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 20:46 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TЕсть какая-то комбинация в условиях которую не учли. Попробуйте такое: Код: plaintext 1. спасибо, все банально тупо переполнение при расчете НОК, выход за разрядность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 21:00 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TЕсть какая-то комбинация в условиях которую не учли. Попробуйте такое: Код: plaintext 1. Переполнение убрал, но теперь "Time limit exceeded", надо еще какую-то оптимизацию дополнительную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 21:10 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Можно попробовать окна из биткарт, как тут делал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 21:13 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Все гораздо хуже. Я пока сходил за пивом, изобрел решение без биткарт, без массивов и вообще без сложностей. Все= в 2с не укладывается этот шарп ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 22:44 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TSiemarglПереписывать на С++ не хочу. на C# используй структуры (struct вместо class), будет близко по скорости к c++ Поучи свою бабушку яичницу жарить =) У меня уже идеальный алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 22:59 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Когда-то на форум.сорцы.ру их мембер albom с блеском решил эту таску. -------- http://forum.sources.ru/index.php?showtopic=250789 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 23:27 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
SiemarglВсе гораздо хуже. Я пока сходил за пивом, изобрел решение без биткарт, без массивов и вообще без сложностей. Все= в 2с не укладывается этот шарп ( В результатах лучшее время 0,284 сек на С++. Получается C# тормознее в 7+ раз? Не верю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 08:00 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
С окнами из биткарт дошел до 10 теста. Time limit exceeded В чистом виде биткарта не поможет, нужна еще какая-то оптимизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 08:22 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TSiemarglВсе гораздо хуже. Я пока сходил за пивом, изобрел решение без биткарт, без массивов и вообще без сложностей. Все= в 2с не укладывается этот шарп ( В результатах лучшее время 0,284 сек на С++. Получается C# тормознее в 7+ раз? Не верю. Потому что у меня все же перебор, а оптимальное решение - вычислительное - просто сложить пару десятков чисел, как Кнокс на форуме откопал. Но так неинтересно. Алгоритм получился простым, может и перепишу потом на С ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 11:52 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Ссылку пока не смотрел, хочу сам голову поломать. ИМХУ условия поставлены так что перебором нерешаемо. Хоть на асме пиши. Этот пример 18813721 имеет ответ ~500 млн., требует полного перебора до лярда, т.е. даже при самом оптимальном алгоритме перебора (попадание только на нужные) чтобы уложиться в 2 сек. на проце в 3 ГГц надо на проверку тратить не более 6 тактов процессора, что очень мало. Самый быстрый способ: заполнить биткарту и то дольше 2 сек будет. Даже без ограничения по памяти. Надо изобретать какую-то алгоритмическую хитрость. Знать бы хоть в какую сторону ее искать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 12:59 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TСсылку пока не смотрел, хочу сам голову поломать. ИМХУ условия поставлены так что перебором нерешаемо. Хоть на асме пиши. Этот пример 18813721 имеет ответ ~500 млн., требует полного перебора до лярда, т.е. даже при самом оптимальном алгоритме перебора (попадание только на нужные) чтобы уложиться в 2 сек. на проце в 3 ГГц надо на проверку тратить не более 6 тактов процессора, что очень мало. Самый быстрый способ: заполнить биткарту и то дольше 2 сек будет. Даже без ограничения по памяти. Надо изобретать какую-то алгоритмическую хитрость. Знать бы хоть в какую сторону ее искать. давно бы уже код показал ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 14:48 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovдавно бы уже код показал ) Стыдно показывать, накидал по-быстрому, сейчас причешу вариант с биткартой окнами (он самый быстрый) и выложу. Может кому пригодится для проверки или как заготовка. У тебя нет мыслей по оптимизации без перебора? ИМХУ в эту сторону надо копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 15:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, мысли есть, конечно, но они очевидные все. Вдруг ты забыл что-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 16:16 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Исходник с++. Окно биткарты Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. Забывать тут нечего, примитивный перебор - самый быстрый из всех переборов. Из оптимизации только контроль задвоений счетчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 16:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TИз оптимизации только контроль задвоений счетчиков.Можно еще взаимные делители контролировать. Например, если есть P 1 =2 и P 2 =4, то они при объединении дают ту же 4, но со сдвигом на 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:07 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, единственное, что увидел: при подсчете результата развернуть цикл в 4 раза, и тогда можно будет обнулять по 32 бита за раз. Но это копейки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:26 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
miksoftDima TИз оптимизации только контроль задвоений счетчиков.Можно еще взаимные делители контролировать. Например, если есть P 1 =2 и P 2 =4, то они при объединении дают ту же 4, но со сдвигом на 2. Тоже думал, но это только если P 2 / P 1 = 2, счетчики step * P 1 и step * P 2 сводятся к счетчику P 1 + step * P 2 Если P 2 / P 1 = 3 уже так не сделать. Т.е. идеале убираем до половины счетчиков. Хотя может и взлетит. Самый жестокий тест у меня cчитается 3 сек Код: sql 1. 2. Только четные - 1,6 сек Код: sql 1. 2. На грани фола, не факт что там такой же быстрый проц. Попробую затестить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:39 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Добавил склеивание двухкратных. Не помогло. Time limit exceeded У меня время самого жесткого теста 1,4 сек. Жалко что у них не i7 Исходник Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:53 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Можно еще запараллелить, но как-то не спортивно это, и не факт что там ядер больше одного :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:01 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Тут надо формулу изобретать. Все что смог изобрести: если НОД(а, b) = 1, то на интервале N результат будет N/a + N/b - N/(2 * a * b) С тремя уже непонятно, НОД(а, b) > 1 тоже непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:15 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, а что не хочешь сделать подсчет (чтение окна) и обнуление двордами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:21 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Есть еще мысль: можно ксорить биткарты. Например есть счетчики (a,b,c,d,e,f) повторяемость (a,b,c) K 1 , (d,e,f) K 2 , делаем две биткарты БК 1 и БК 2 дальше проход по ним подсчет бит в XOR(БК 1 [i % K 1 ], БК 2 [i % K 2 ]) можно третью и т.д. добавить, но тут главное чтобы все K i были выравняны, т.е. кратны 8. В этом засада. Еще проблема из-за ограничения памяти, т.е. разбить счетчики на группы так чтобы сумма(K i ) была меньше 16 Мб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:33 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, а что не хочешь сделать подсчет (чтение окна) и обнуление двордами? Сделал еще быстрее Код: plaintext 1. 2. 3. 4. 5. у меня c 1,4 ускорилось до 1,24 сек., но там все-равно не пролез по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:40 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, да не быстрее это ) читай двойное слово, потом для каждого прочитанного байта сумма, потом пишешь 0 двойным словом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:52 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, да не быстрее это ) читай двойное слово, потом для каждого прочитанного байта сумма, потом пишешь 0 двойным словом. Написал так Код: plaintext 1. 2. 3. 4. стало 1.6 сек. Предлагай свой вариант. имху быстее memset() вряд ли получится, это функция для обнуления блока памяти и ее реализация в компиляторе отточена до идеала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 19:51 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, читай сразу двойное слово одним чтением, выделяй из него байты, сдвигами и эндами, с каждым из них уже лезь в таблицу. Так по идее быстрее - на три чтения меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 19:56 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Написал так Код: plaintext 1. 2. 3. 4. 5. 6. 7. стало 1,23, т.е. на 0,01 сек быстрее. Некуда в эту сторону двигаться. Разве что оба цикла пытаться на асме переписать, и то не факт что быстрее станет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:04 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, а почему бы все таки, наконец, не сделать так, как я написал ) Так будет и быстрый подсчет, и обнуление ЗАДАРОМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:08 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, читай сразу двойное слово одним чтением, выделяй из него байты, сдвигами и эндами, с каждым из них уже лезь в таблицу. Так по идее быстрее - на три чтения меньше. Ступил. Чуть быстрее. 1.15 сек стало. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Но тест не проходит по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:10 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, еще быстрее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:14 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, еще быстрее Нет. Медленнее. 1,55 сек. Тут k надо перечитывать. У меня не надо. Она в регистре живет. Можно еще подобным образом пошаманить над циклом заполнения Код: plaintext 1. 2. 3. 4. 5. сделать обращение к биткарте 4хбайтным и v >> 3 как-то оптимизировать, т.к. в 32 бита по несколько раз много счетчиков попадает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:32 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Это шаманство дает копеечное ускорение. Я бы все-таки копал в сторону уменьшения количества счетчиков. Сейчас их 25. Шаг Код: sql 1. хотя бы как-то убрать самые частые: 4 6 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:39 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, Ясно. С заполнением бит-карты вряд ли быстрее удастся. Можно, конечно, немного поиграть с разворачиванием цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:40 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Посчитал сколько бит сбрасывается из 1 в ноль Код: plaintext 1. 2. 3. 4. Код: sql 1. потенциальная возможность для ускорения совершенствованием алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:52 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TЭто шаманство дает копеечное ускорение. Я бы все-таки копал в сторону уменьшения количества счетчиков. Сейчас их 25. Шаг Код: sql 1. хотя бы как-то убрать самые частые: 4 6 10 счетчики 4, 16, 32, 34, 36, 40, 48 можно сделать двумя битовыми масками при подсчете результата, если цикл развернуть еще вдвое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:56 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, ошибочка только счетчики 4, 16, 32 можно сделать одной битовой маской при подсчете результата ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:04 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovсчетчики 4, 16, 32, 34, 36, 40, 48 можно сделать двумя битовыми масками при подсчете результата, если цикл развернуть еще вдвое. не понял о чем речь, давай поподробнее. только не забывай что мы их уже один раз модифицировали 18815259 : 4 это 2+4k, т.е. с 2 шаг 4 16 это 8+16k и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:05 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, по всем счетчикам, на которые делится 32 (они дают повторы битов через 32) один раз формируем маску mask, и далее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. естественно, эти счетчики не участвуют в заполнении бит-карты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:11 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
последействие паскаля, вместо xor надо было ^ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:15 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, по всем счетчикам, на которые делится 32 (они дают повторы битов через 32) один раз формируем маску mask, и далее понял, сегодня уже плохо соображаю, завтра затестю. Я еще голову ломаю как бы счетчики с отношением 3 склеить. Там шаг должен быть 1,2,1,2 т.е. можно менять шаг битовым сдвигом туда-обратно после каждого шага. Это в мыслях пока. текущий вариант исходника Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:20 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T Я еще голову ломаю как бы счетчики с отношением 3 склеить. Там шаг должен быть 1,2,1,2 т.е. можно менять шаг битовым сдвигом туда-обратно после каждого шага. Это просто: step=3-step. Придется хранить не 2, а 3 описателя для каждого счетчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:25 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Кстати, не будет так быстрее? Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:29 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovКстати, не будет так быстрее? Код: plaintext 1. 2. 3. 4. так еще медленнее. Что-то у меня 1,15 сек 18815517 опять вырасли до 1,4. хз чего направил завтра перепроверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:39 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima Tпонял, сегодня уже плохо соображаю, завтра затестю. Там есть пара тонких мест: 1) кратность размера окна 4 байтам (32 битам) - ну это и так есть, 2) кратность общего количества лампочек 32 - если ее нет, то придется вычесть лишние висячие биты маски. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima Tпонял, сегодня уже плохо соображаю, завтра затестю. Там есть пара тонких мест: 1) кратность размера окна 4 байтам (32 битам) - ну это и так есть, 2) кратность общего количества лампочек 32 - если ее нет, то придется вычесть лишние висячие биты маски. 1. есть 2. есть. Заполнение биткарты счетчиками заканчивается на N, а вот с масками на 4,16,32 это надо будет учесть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:54 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Ого тут букв! А пробовали учесть повторы делителей 3,4,5 ? Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:59 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
mayton, пока что ясно: 1) шаги 2, 4, 8, 16, 32 учитываются одной общей маской при подсчете суммы, 2) шаги X и 2X заменяются одним сдвинутым шагом 2X, 3) шаги X и 3X заменяются одним переменным сдвинутым шагом 2X/2 остальное пока неясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 22:31 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
опечатка 3) шаги X и 3X заменяются одним переменным сдвинутым шагом 2X/X ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 22:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Восстановил исходник, который работал 1,15 сек. ИМХУ склеивание счетчиков тупиковый путь. Для того что очевидно как клеить (типа кратных двум) скорее всего сделали тесты так чтобы клеить было нечего. Переделал наихудшие тесты с учетом нашей оптимизации по склеиванию кратных двум. это считается 1,75 сек Код: sql 1. 2. это считается 1,4 сек и никак не склеится Код: sql 1. 2. Мне кажется надо в первую очередь оптимизировать малые счетчики, т.к. там проходов больше всего СчетчикИтерацийДоля250000000014.3%33333333339.5%42500000007.1%52000000005.7%61666666664.8%71428571424.1%81250000003.6% Счетчики 2,4,8,16,32 суммарно 27,7% итераций. Оптимизация масками должна заметно их ускорить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 08:55 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Любые малые счетчики можно масками наносить, просто надо сдвиг дополнительный, например для 3x: Код: sql 1. 2. 3. 4. 5. для 5 уже таблица сдвигов [3,1,4,2 ...] Думаю можно развить эту идею: 18815352 заготовить каждому счетчику биткарту выравненную по 4 байтам и наносить счетчики биткартами. В каждой биткарте байт будет не более значение счетчика * 4. Для 2,4,8,16,32 можно одну общую биткарту использовать. Для счетчиков кратных 2,4,8,16 тоже общие биткарты можно. Например 5, 20, 40 должны объединиться на биткарте 40, если не напутал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:14 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, думаю, ощутимый выигрыш даст только маска для степеней двойки. Для других сдвигов маска малопригодна, т.к. придется работу переносить в подсчет, а там будет довольно накладно запоминать состояния переменного числа шагов. Ну, может быть, стоит шаг=3 отдельно учесть. Т.е. делаем размер окна кратным 12 байт, и если тройка есть среди множителей, то подсчет идет другим циклом, развернутым в 3 раза. Можно и подсчет без тройки тоже развернуть. И, думаю, от склейки по 2 не стоит отказываться, т.к. она дается даром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:38 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Склейка 1 к 3 или 2 к 3 тоже достаточно дешева: для всех таких (1 к 3 или 2 к 3) заполнение окна делаем в другом цикле, который отличается от твоего одним лишним вычитанием в теле цикла step=m-step ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:46 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Ты не понял, для счетчика один раз инициализируется биткарта, примеры на 8-битовых (биты в обратном порядке 0-7 для наглядности): Код: sql 1. 2. 3. дальше просто зацикливаем маску и по кругу. Предыдущая оптимизация с двойками не теряется, но и добавляются новые. Например маска для 3 дважды ложится в 6, т.е. их склеиваем при инициализации. То же самое с 12, туда лезут 3,6. В 48 влезут 2,3,4,6,8,12,16,24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:55 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
В общем вся математика на этапе инициализации, во время расчета тупо XOR двойными словами( по 32 бита) и подсчет результатов. Даже изврата с единицей не надо, ее в любую маску можно добавить. Должно сработать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 10:00 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Я понял, потому что думал над этим раньше ) Тут очень большая проблема, которая почти наверняка потребует создание внутреннего цикла внутри подсчета и работы с памятью. Тройку (и если хочешь простыню - пятерку) можно учесть масками без доп. работы, если развернуть цикл. Но не более. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 10:03 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
разумеется, при этом под оптимизацию попадают все делители чисел 96 и 160 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 10:10 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Вторым шагом можно досклеить полученные биткарты пока пямяти хватает: например 13 и 17 склеятся в 884 байта (13 * 17 * 4). Хотя тут не факт что ускорение будет, т.к. маленькие вместе влезут в кэш проца, большие будут из памяти подкачиваться постоянно. С другой стороны чем меньше биткарт, тем быстрее будет считаться. Пока некогда, ближе к вечеру постараюсь написать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 10:11 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Написал. Летает. 50 счетчиков до лярда 0,2 сек. Но это 0.42 сек. Код: sql 1. 2. медленнее потому что склейка счетчиков не самая лучшая. В первом случае 50 склеилось в 4 счетчика, во втором всего в 9, хотя можно минимум в 4. Надо какой-то оптимальный алгоритм склейки. Суть в следующем: счетчик a занимает size_a = НОК(а,4) байта, счетчик b - size_b = НОК(b,4) байт, при слиянии займут size_ab = НОК(size_a, size_b) например а = 11 тогда size_a = 44, b = 18 => size_b = 36, после слияния счетчик ab займет size_ab = 396 И тут их надо так слить чтобы суммарно они не вылезли за 16 Мб. Я поставил 14. ХЗ как комбинировать. Пока сделал так: берем последний, поиск такого с которым size_ab минимальное, если нашли и памяти достаточно - слияние. ХЗ как оптимизировать. Факторизация и ... ? PS Сайт для проверки лежит, пока не затестить, но думаю пройдет тест. Исходник выкладывать или пусть желающие сами пишут по инструкции выше ? PPS Ссылку Fort Knox почитал по диагонали, нифига не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 15:11 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Или по другому, в случае ряда простых чисел типа Код: sql 1. разбить их на минимальное количество групп, так чтобы сумма произведений членов каждой группы была меньше заданного предела. например две группы Код: sql 1. Если в одну не сливается, то данное решение уже идеально, т.к. принципиально минимизировать количество групп, а не результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 15:19 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
50 в 4 слилось так (лог) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. при загрузке склеиваются только если меньший влазит в больший кратно 2 раз ГрупповойИсходные01 2 4 5 8 10 16 20 25 32 40 5017 14 28 4923 6 12 24 483 474 23 46511 22 44643721 42841913 26 391019 381137129 18 361317 34143315311615 3017291827 После слияния групповых стало так ГрупповойИсходные01 2 4 5 8 10 16 20 25 32 40 50 15 30 13 26 39 19 38 17 3417 14 28 49 21 42 33 11 22 44 3123 6 12 24 48 27 9 18 36 29 23 46 373 47 43 41 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 16:09 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TНаписал. Летает. Здорово, если пройдет тест на скорость. Dima TСсылку Fort Knox почитал по диагонали, нифига не понял. Дык, XOR множеств. Отличие от формулы включений-исключений только в том, что надо дважды вычитать то, что пересеклось. По идее слагаемых должно быть 2^x, но реально их намного меньше, т.к. лампочки, входящие в пересечение нескольких множеств часто оказываются дальше последней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 16:30 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, я чувствуется опыт Решета Эратосфена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 17:38 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
maytonDima T, я чувствуется опыт Решета Эратосфена. Тут все из него. От теории до реализации. Придумал оптимизацию счетчиков. Сворачивается в 4 счетчика. Время 0.3-0.4 сек на самых тяжелых случаях. Никто не высказался против выкладывания исходника, поэтому выкладываю. Думаю рядовым студентам он бесполезен, а олимпийцы только опыта поднаберутся. Тупым гуглением олимпиаду не выиграть. Исходник (многа букав) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. PS На проверку не отправил, т.к. сайт-проверялка лежит. У меня итого сходится с предыдущими реализациями. Завтра утром зашлю, если оживет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 19:57 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
maytonDima T, я чувствуется опыт Решета Эратосфена. Только сейчас понял что тогда к Эратосфену надо было прикрутить эту идею со склеивающимися счетчиками, а то я какие-то велосипеды с квадратными колесами изобретал в виде счетчиков с переменным шагом 17486621 . В итоге вся оптимизация закончилась на 3-ке, а так можно заготовку биткарты сделать и ее использовать для инициализации (для 2,3,5,7,11 потребуется всего 9 Кб). Надо будет добавить туда как-нибудь. А то я там "рекорды" ставил распараллеливанием на 4 ядра. Судя по этим замерам там тоже должно ускориться в 3-5 раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 09:27 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Задача сдана ? Не могу даже условие посмотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2016, 02:01 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Не сдана. Там все сломалось http://acmp.ru/index.asp?r=151923784153675657266782 [20.02] Уважаемые пользователи! В связи с техническими сложностями (вышел из строя веб-сервер) сайт был недоступен и в настоящее время используется его копия. В связи с малой мощностью предоставленного сервера возможность авторизации пользователям будет ограничена (участники раздела "Курсы", спонсоры и т.д. смогут решать задачи в любое время, остальные - по воскресеньям и с 17:00 до 4:00 в другие дни)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2016, 15:12 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Вот к чему приводит возведение 99 десять раз в степень 99. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 17:07 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Заслал на проверку. Прошел все тесты. Время 0,397 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 17:26 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Ты крут как варёные яйца. А я щас делаю задачу с укладкой домино. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 18:22 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
maytonТы крут как варёные яйца. А я щас делаю задачу с укладкой домино. в пятничную тему не выноси. Не сдержусь Работы навалили со всех сторон одновременно. Я в Эратосфена начал вписывать то что тут родилось, взлетел он немного с 23 до 27 млн в сек., но не все дописал. Мысли еще есть, времени пока нет. С паспортами тоже почти закончил 18772620 , чуть-чуть доделать, потестить и готовый продукт будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 19:57 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TЗаслал на проверку. Прошел все тесты. Время 0,397 сек. Поздравляю ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2016, 07:07 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonТы крут как варёные яйца. А я щас делаю задачу с укладкой домино. в пятничную тему не выноси. Не сдержусь Работы навалили со всех сторон одновременно. Я в Эратосфена начал вписывать то что тут родилось, взлетел он немного с 23 до 27 млн в сек., но не все дописал. Мысли еще есть, времени пока нет. С паспортами тоже почти закончил 18772620 , чуть-чуть доделать, потестить и готовый продукт будет. И не подумаю. Я до 4.00 утра просидел с домино. Пока не понял что алгоритм волны не покрывает общий случай. И нужен поиск в глубину. Да ну ево в пень. Будет настроение - опубликую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2016, 12:17 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1340780]: |
0ms |
get settings: |
5ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 466ms |

| 0 / 0 |
