Всем привет!
Очень скоро, 25 апреля в 19:30 MSK, состоится очередной Codeforces Round #181 для участников Div. 2. Как обычно, Div. 1 участники смогут поучаствовать в этом раунде вне конкурса.
Задачи были подготовлены группой авторов в составе: Гриднев Виталий (gridnevvvit), Игнатьев Александр (aiMR). Выражаем благодарность Геральду Агапову(Gerald) за помощь в подготовке задач, Михаилу Мирзаянову(MikeMirzayanov) за замечательные системы Codeforces и Polygon, Марии Беловой(Delinur) за перевод задач на английский язык.
Немного информации об авторах: я и Александр — студенты 3 курса Механико-Математического факультета Саратовского Государственного Университета. Для нас это первый раунд и, я думаю, что не последний.
Мы надеемся, что Вам понравятся наши задачи, и вы получите удовольствие от их решения.
Также настоятельно рекомендую Вам прочесть условия всех задач!
Всем удачи и высокого рейтинга!
UPD: Разбалловка задач будет динамической. Задачи расположены в порядке предполагаемой сложности.
UPD1: Разбор задач
UPD2: Соревнование закончено. Поздравляем победителей:
С дебютом авторов и ВСЕМ удачи! Надеюсь задачи будут как всегда интересные)
Can't wait, hopefully it won't be too much maths :D
a
I think it will be interesting.
Good Luck ^_^
I hope the system testing starts soon after the contest not like the last contests.
System testing after contest starts when authors of task check all hacks.
I think it's not true because all hacks are checked automatically by validator.
I suppose that main reason of our waitin' is that validator checks all the hacks.
Welcome ! New authors always have interesting problems I think today it will be too :)
One of the best announcements I ever read !!
i hope today will be my day :))
oh oh oh, abo's day its unbelievable :D :D
gl & hf all! :)
Еще полгода назад я и не знал о таком сайте, как codeforces. Очень часто в контестах встречаются интересные задачи, способствующие развитию мышления. Я уже в нескольких контестах принимал участие, разумеется, с удовольствием приму участие и в этом контесте. Спасибо авторам за подготовленный контест. Всем успехов!
Он был бы ещё более замечательным, если б тут не минусовали любой попавшийся коммент, как твой)
Абсолютно согласен. Я вчера вопрос задал и мне 65 лайков наставили:)
Сегодня состоится 181 раунд codeforces, я как участник этой олимпиады, готов участвовать в нем.
Саратовске ребята всегда готовят хорошие задачи. Удачного контеста всем...!!!
Главное чтобы не "первый блин комом" :)
This is my first contest in codeforces, hope i can solve some problems in the contest
best of luck, buddy.....:)
thanks , pray for me , best of luck to you also
Hello, I'm Commander Sheppard and this is my first contest on Codeforces!
ой кого-то забанят...
Найти бы отца этих мальчиков.
Hope to solve at least 3 problems :)
what'er pity not joinning this contest= =..dynamic scoring could be really exciting and fun T____T...hope to reach 1700 T_T
Codeforces was down. But how could lrb know about it? He was sure that the solution was incorrect. He pressed and pressed the button
Hack!
but nothing was happening. "Ok, I'm going to count how many times I pressed that damned button!", he thought: "66, 67, 68! Codeforces is available again! Let's see where my +100 points are..."Now he has 215 unsuccessful hacks
Психанул!)
When I saw that lrb wanted to hack my code my heart started boom boom boom:)I thought that my solution is wrong:)but when i saw that he has more than 100 unsuccessful hacks i understood that he want to break record and i calmed down:)
우리의 위대한 지도자 김 장군의 명예에, 나는 미국 제국주의를 정복 할 수있을만큼 우리 민족 강하게 만들기 위하여 열심히 컴퓨터 과학을 공부합니다!
Your letters are so cute :)
what is the 5th test in B problem??? "@
Как всегда, узнаю о контесте когда он уже идет или прошел...
А задача D мне нравится. Почему ее так плохо решают? ..(
Hey, really enjoyed this competition, but i got a little problem with problem C. So im asking you for little help.
Here is what i came up with: We generate all possible sums ( highest possible sum has 6 digits ) and make equation
N = x*a + y*b, where N is our sum ( we do this with every generated sum ).
And we find number of solutions to this equation that: x>0, y>0 and a+b<=N ( it's pretty
clear ).
For most of my time i was trying to come up with some nice dp solution, but it turned
out to be impossible for me... If it's one right solution desribed above, then please explain to me how to calculate
those all solutions nicely?? Because for me it got too messy and i finished with only 2
first tasks :(
:) Thanks in advance
I think that answer is sum(C(n, x)) if N = x*a +y*b is good, but there is small problem for me, how fast and correct calc C) Sorry for my bad english.
n!/(x!*y!) — number of different numbers of length n and containing x of "a" digits and y of "b" digits.
You can use this : C( n , k ) = n! * pow( (n-k)! * k! , mod-2 )
from the "Number Theory" : (1 / b) % mod == ( b^(mod-2) ) % mod , because mod is a prime number !
Sorry for my bad english
i knew there is must be using some number theory, but, sadly after knowing a and b value, i cant compute C(n,a)
could you explain more with n = 14215 and k = 13517 ?
thx (taken from test 3 )
only pre-calculate every factorials module 1000000007 and store this numbers in an array .( for example fact array ) this step takes O(N) time and space .
then C( n , k ) = fact[n] * power( fact[k] , mod-2 ) * power( fact[n-k] , mod-2 ) . this step takes O( Log N ) .
or calculating c(n,k) using c(n,k-1) c(n,k) = c(n,k-1)*(n-k+1)/(k)
but as Reza said, we have to pre-caculate them.
actually this wont work !
because there is no necessity that c(n,k-1)%MOD or (n-k+1) is divisible by k.
this will lead you to WA.
of course!
i didn't mention that for dividing u need to use modular division, i just said that this is another way tu calculate c(n,k)...
for dividing u can use pow(k, mod-2)(as Reza said) or use Extended Euclid algorithm :
both run in O(logn) time. however, pow(k,mod-2) is a lot easier... ;)
so that was my fault, I misunderstood you. :)
"from the "Number Theory" : (1 / b) % mod == ( b^(mod-2) ) % mod , because mod is a prime number !"
Could you provide references to this proof?
from "fermet's little theorem" : a^(p-1) % p = 1
thus a * a^(p-2) % p = 1 and a % p == a^(p-2) % p from other view a * ( 1/a ) % p = 1 and a % p == (1/a) % p
finally : (1/a) % p == a^(p-2) % p
the same idea, but a little bit differences. x is the number of digits a still have sum=a*x+b*(n-x) (a,b from input), for each single value of x, i check whether sum is a good number. if yes, calculate number of numbers you can create with that.
the only problem that i had is the final step.
Хорошо! Понравилось решать задачи) Спасибо очень хороший контест gridnevvvit :)
Как решалась Е?
Очевидным решением было разложить произведение чисел из ввода на простые сомножители и потом бинарным поиском искать такое число, разложение факториала которого содержит каждое простое число, которое содержится в разложении силы Империи, как минимум столько же раз.
Но, естественно, разложение произведения чисел из ввода требует O(k * p * log a), что всё-таки слишком много.
Всё верно, основная задача посчитать степени простых в знаменатели, а сделать это можно с помощью решета, которое находит наименьший простой делитель числа. Когда мы все найдём, то для каждого числа от 1 до максимального а, посчитаем сколько раз оно войдёт в знаменатель, это просто кол-во чисел а, больше либо равных данного, а далее факторизируем его за О(кол-ва простых делителей). В сумме для всех чисел от 1 до 10 в 7 это работает быстро
Красиво)
Мой вариант, немного извращенный:
Посчитаем num[i] — сколько чисел i было в инпуте, на основании этого s[i] — сколько чисел в инпуте не больше i.
Теперь для каждого простого числа будем определять его степень в знаменателе. Как мы это делаем? Пусть наше число k. Рассмотрим все интервалы вида pk...pk+k-1, т.е. все интервалы чисел, которые при делении на k дают p, по всем p таким, чтоб интервал влезал в 10 миллионов. Для каждого такого интервала мы можем посчитать, сколько чисел из этого интервала было в инпуте, и для каждого такого числа мы знаем, что при вычислении его факториала мы p раз умножим на число, в разложении которого есть делитель k. Поэтому к степени числа k в знаменателе надо прибавить (s[pk+k-1]-s[pk-1])*p. Теперь нам надо обратить внимание на случаи, когда k входит в разложение в степени >1. Для этого решим аналогичную задачу для k^2, k^3, k^4 и так далее:)
Я думал над таким вариантом, но мне показалось что там просто гигантское кол-во операций получится, а сейчас прикинул, что там сумма ряда даже меньше гармонического) Если только первые степени рассмотреть, то получается n * (1 / 2 + 1 / 3 + 1 / 5 + ...), кстати кто-то в курсе оценок для его суммы, не O(log(log(n))) ли?
Я был очень близок... Как надо осуществлять проверку в бин. поиске?
Скорее одним пробегом, за O(k * log x).
I can't believe that my B is going to fail because I forgot to check if the "connected-team" size is less than or equal to 3, submitted and locked it. Just after I locked it I remembered that. :(
Понравилась задача Е Звездные войны еще в моде)
не савсем понятна задача D А как она решалась?
задачу А не все сдали Просто реализация нечего сложного )
Смешно просто что задачу E не все сдали Просто реализация нечего сложного )
Может мне кто-нибудь объяснить 2 вещи. Во-первых, почему в задаче С имеется вот такой вот тест: входные данные 2 3 10 выходные данные 165 Если я правильно понял условие, нужно найти количество "замечательных" чисел длины 10, то есть 10-значных чисел, состоящих из 2 и 3 и имеющих сумму, которая является "хорошим" числом. Ясно, что хорошие числа длины 10 могут иметь сумму от 20 (все двойки) до 30 (все тройки). В диапазоне от 20 до 30 есть только одно хорошее число — 23. Такую сумму имеют числа из 3 троек и 7 двоек. То есть, их количество 10!/(7!*3!)=120. Откуда 165?! Второе: почему в задаче D, в тесте 7 2 нельзя первым шагом выбрать 2-ю строку и 2-й столбец, получит 2 квадрата 1*1 и 5*5 и вторым шагом разбить на квадраты квадрат 5*5. Если можно, то почему ответ на тест 4?! Ответьте кто-нибудь, пожалуйста.
Не учёл вариант 8 2. Тогда получается хорошее число 22
Точно. А что с квадратами?
Ну если сделать, как вы говорите, получится еще два прямоугольника 1x5, что запрещено по условию
Ясно.
I think the problem more difficult than before.. a lot of counter testcase..
I loved the contest, especially C, got it accepted at the last minute (stupid overflow mistake :(). This is when you have to love the dynamic scoring :)
Thanks!
When is the rating come out??
Nice contest, keep up the good work.
The problem A — Array in the description it guarantees a correct solution: 1st list -product should be negative 2nd list — product should be positive 3rd list — product should be zero
where as your pretext 3 test case is : Input 5 -1 -2 1 2 0 Output 1 -2 3 -1 1 2 1 0
This is incorrect. List 2 doesn't have a positive product. -1 * 1 * 2 = -2 is NEGATIVE. WRONG TEST CASE.
It's your output, not jury's.
ohh.. sorry.. got it now. i read it in the incorrect order... thanks.
what's the idea of problem D
UPD :
Расскажите что-то про 3-ий тест в задаче D. Я вижу, у многих ответы как у меня.
Делал так: 1) Для четных — ответ или 1 если k==0, или 0
2) Для нечетных — посчитаем глубину числа — сколько раз его можно делить на квадраты (пока делим на 2 и получаем нечетное число — наращиваем глубину). Далее динамика. В динамкие делим на 4 сына и пробуем перераспределеить действия между 4-мя сыновьями.
У тебя хотя бы 3, а у меня 2) И я толком не могу понять в чем не прав, но смысл такой же: максимальная "глубина" — это кол-во единичек подряд в двоичном представлении начиная с младшего разряда, кроме случая степени двойки минус 1, тогда глубину надо уменьшить на 1. Далее динамика D[k][deep] — кол-во способов разбить квадрат k разрезами с макcимальной глубиной разреза deep, пересчитывается D[k][deep]=D[a][deep-1] * D[b][deep-1]*D[c][deep-1]*D[d][deep-1] | a+b+c+d -1 = k; Чтоб за 3 степень не пересчитывать ещё во второй динамике храним Pr[k][deep] = D[a][deep]*D[k-a][deep];
Ну у меня то же самое, только я пересчитывал по другому — в динамику подавал номер сына и за линию перебирал сколько ему отдавать.
Звучит вроде бы правдоподобно, пока баг не вижу.
Я тут немного подебажил — вроде что-то не так. Смотри, у тебя D[1][2]=2. То есть выходит, что квадрат глубины 2 можно разбить одним разрезом двумя способами.
Я переделал чуть твое решение — АС.
3630529
Спасибо, тоже допёр — по несколько раз одни и те же состояния считаю, дал маху)
Для нечётных единица не подходит)
http://codeforces.net/contest/300/submission/3630176
Уууу, я вообще неправильно высчитывал глубину. Олень — это жизненное призвание.
Спасибо :)
Hey a newbie question but I can't seem to find it in the FAQ or anywhere
How long does it take for ratings to change after a competition?
I go back to sleep right after matches (I'm in Austrlia) so I don't find out.
It takes around 2 or 3 hours to update your rank.
my first contest still rating is not updated ? why always me ?
Your rating will be updated soon..it takes little time to update ratings. Happy coding :)
А можно узнать почему так долго пересчитывается рейтинг ?
problems were quite interesting..hope to see your problems again soon.
Problems were quite interesting.Hope to see you again soon.
Кстати у меня до сих пор стоит баг с рейтингом, рейтинг поднимается когда у меня -37.
this round was better than I expect !