Блог пользователя Electronick

Автор Electronick, 14 лет назад, По-русски

Есть поле размеров N x M клеток. Вы стоите в клетке А(1,1) вам требуется дойти до клетки B(N,M). За один ход вы можете перейти на одну клетку вверх или на одну клетку вправо. Вам требуется посчитать число различных маршрутов из клетки А(1,1) в клетку В(N,M). Два маршрута считаются различными, если они различаются, как минимум в одном ходе.

Входные данные

В единственной строке N, M<= 1 000 000 , K <= 10 ^ 9;

Выходные данные

В единственной строке выведите ответ на задачу по модулю К.

 

Пример                                                                

1 100 10                                             1

2 3 10                                                 3



  • Проголосовать: нравится
  • -13
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=combinatorics 

Тут есть,биномальный коэффициент это.

14 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Заметим, что всего потребуется N-1 раз шагнуть вверх и M-1 - вправо. То есть маршруты различаются между собой только тем, в каких случаях мы будем передвигаться, например, вверх. Всего шагов будет N+M-2. Тогда количество маршрутов будет числом способов выбрать N-1 шаг из всех N+M-2. Допустим, мы выбрали какую-то комбинацию номеров шагов; тогда этой комбинации будет соответствовать маршрут, в котором на шагах с выбранными номерами мы идем вверх, на остальных - вниз. Каждая комбинация при этом будет соответствовать одному маршруту, и таким образом можно задать все маршруты. Значит, ответ - количество комбинаций из N+M-2 по N-1, или C(N+M-2, N-1).
14 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится
Любой путь из клетки [1, 1] в клетку [N, M] состоит ровно из N + M - 2 шагов. Из них N - 1 раз по одной оси, а M - 1 по другой. И тут в игру вступает комбинаторика. Ответом является число сочетаний из N + M - 2 по M - 1, что, в принципе, равно числу сочетаний из N + M - 2 по N - 1.
Ну а как это посчитать по непростому модулю - это другой вопрос. Я бы использовал такой подход: подсчитаем для каждого простого числа сколько раз оно входит в качестве множителя в числитель и знаменатель числа сочетаний. Факторизацию надо осуществлять, перебирая только простые делители, которые заранее можно получить с помощью решета Эратосфена.
14 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Каждый путь можно представить как строку из N-1 символов 'R' (ход вправо) и M-1 символов 'U' (ход вверх), как-то перемешанных между собой. И наоборот, каждой такой строке соответствует некоторый путь. Поэтому число путей равно числу таких строк -- это число сочетаний C(N+M-2, N-1). 

C(N+M-2, N-1) = (N+M-2)!/((N-1)!*(M-1)!)

Чтобы быстро это посчитать, можно найти для каждого простого числа от 2 до N+M-2 степень, в которой оно входит в каждый из факториалов. Степень, в которой простое число p входит в факториал N! равна [N/p]+[N/p^2]+[N/p^3]+... Все деления целочисленные. Простые числа можно определить решетом Эратосфена. Зная степени простых чисел, просто перемножаем эти числа по модулю K.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Всем большое спасибо!!!!
14 лет назад, # |
Rev. 2   Проголосовать: нравится -10 Проголосовать: не нравится
Еще можно обозначить массив a[0..n+1][0..m+1], каждая ячейка a[i][j] будет обозначать количество способов попасть в клетку i,j. a[1][1]=1; ( есть только один способ попасть в клетку в которой мы уже стоим ) для всех остальных a[i][j]=a[i-1][j]+a[i][j-1], так как в клетку i,j мы можем попасть из клеток (i-1),(j) и (i),(j-1). a[0][j] и a[i][0] равны 0, по-тому, что мы не можем туда попасть и кол-во способов 0. Ответом будет a[n][m](кол-во способов попасть в клетку n,m)
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Если посмотреть на ограничения (N и M порядка 106), то массив размерности N x M мы не заведем. Более того, решение с оценкой времени выполнения O(NM) будет работать в лучшем случае 1000 секунд, а это означает, что даже если реализовать так, чтобы обходиться двумя строками матрицы, то все равно такое решение не зайдет. Учим комбинаторику!
14 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится
ээээ....эта задача какбэ на еще идущем заочном этапе кубка моей гимназии=)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    Сами виноваты, нечего давать баяны на официальные этапы. Пусть новые задачи придумывают.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится

    Всё,Костя,надо снимать задачу)

    Кстати,а кто её писал,ты или Ваня?

  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Как совет организаторам: ничего не снимайте :) Просто дисквалифицируйте участника, который таким образом решил сдать задачу. У вас есть полная информация о нем, just do it!
    • 14 лет назад, # ^ |
        Проголосовать: нравится +2 Проголосовать: не нравится
      А мы его поминусуем :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится -12 Проголосовать: не нравится
        ЭЭЭ) она же  не принимается!! (причём давно!!!)!!
        • 14 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
          Не стоит обращать столько внимания на вклад
          • 14 лет назад, # ^ |
              Проголосовать: нравится +1 Проголосовать: не нравится
            Вот только в хабр, пожалуйста, CF не надо превращать, где за упоминание слов "рейтинг" и "карма" любой человек (кроме, видимо топов) загоняется в такой минус, что легче зарегистрировать новый аккаунт, чем выбраться до уровня "моу писать новые посты и комментировать чаще раза в час".
            Жутко бесит. Правда, тут еще нет системы "<20 рейтинга - писать нельзя" - это радует. Поэтому можно действительно обращать меньше внимания.

            • 14 лет назад, # ^ |
                Проголосовать: нравится +3 Проголосовать: не нравится
              и не собирался)
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Просто "Не стоит обращать столько внимания" - именно этой фразой и аргументируют минусовальщики на хабре :) А то, что после этого человек ничего делать не может, всем, конечно, пофиг.
                Закрыли тему :)


    • 14 лет назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится
      Такое чувство что если бы он сюда написал условие какой-то другой задачи,не баянной как вы тут говорите, никто бы не написал решение.  (да и не знал я что она была на tc когда-то)Так что не вижу ничего плохого в этой задаче. :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится -14 Проголосовать: не нравится
        ТЕМ БОЛЛЕ каким бокам я до вашего кубка!!!!!!!!!!!! Я просто нашел интересную задача и решил уточнить у более знающих людей как её правильно решить!!!!!!  
        • 14 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
          :))) да действительно и даже тесты не поменял. А контест кстати еще идет.
          Мне все равно , в том плане если кто-то загуглит решение, или прочитает  его в книге, но пусть он сделает это сам :) В конце-концов это же заочный этап(да, спасибо). Но тупо вот так написать сюда , как-то совсем уж некрасиво. А в плане дисквалификации. Никто не будет дисквалифицирован.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            мб заочный?
          • 14 лет назад, # ^ |
              Проголосовать: нравится -8 Проголосовать: не нравится
            Я в нем даже не участвую!! !!!!!
            • 14 лет назад, # ^ |
                Проголосовать: нравится +5 Проголосовать: не нравится
              1. Вы прочитали то, на что ответили? Проблема в том, что Вы создали хорошо индексируемое поисковиками решение задачи активного контеста. И тут уже не важно, участвуете вы или нет. И, все-таки, я думаю, что это было скорее предупреждение, чем обвинение.
              2. Ну неужели нельзя обойтись без 43 восклицательных знаков на три сообщения и без слов, набранных заглавными буквами? Ну это же не сложно вроде бы...
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    На свете есть масса гимназий и тд... И если организаторы "сумели" придумать очевидное условие задачи - это проблема организации... Не дело отвечающих на позыв ----помогите с задачей отслеживать контесты всяко-разных гимназий...
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      А кто-то просит их отслеживать или винит отвечающих?
      • 14 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Никто не просит... Но когда после сообщения "Помогите... " появляется комментарий "Это с нашего еще идущего поселкового контеста" - умиляет...
        • 14 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          Не вижу здесь вины организаторов и вообще какой-либо проблемы, помимо вашей умиляемости. Человек запостил задачу, в комментариях написали источник.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Просмотрев обсуждение я вижу что человеку за фразы типа "не знаю я ваших кубков..." поставили кучу минусов... Если это участник контеста - нужно не минусовать, а дисквалифицировать( расстреливать), если нет - то минусование навевает нездоровые амбиции организаторов и тд
            • 14 лет назад, # ^ |
                Проголосовать: нравится +3 Проголосовать: не нравится
              Задача хоть и распостраненная, но её условие достаточно уникально написано чтобы не ловиться(я пробовал) гуглом в других открытых серверах с задачами. Так что товарищ явно скопировал условие с сайта гимназии на котором написано что заочный тур ещё идет, что не очень красиво, пусть даже он и не участвует.
              • 14 лет назад, # ^ |
                Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
                Тарас, в след. раз когда, какой-нибудь парень с поселка\деревни\агрогородка\местечка, напишет что-нибудь неприятное для тебя , напиши ему в личку что он мудак, и не ведись на его троллинг.
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
А мне интересно решение данной задачи, если на карту еще поставить L (порядка 10^3) препятствий, в виде прямоугольников.
14 лет назад, # |
  Проголосовать: нравится -17 Проголосовать: не нравится
ТЕМ БОЛЛЕ каким бокам я до вашего кубка!!!!!!!!!!!! Я просто нашел интересную задача и решил уточнить у более знающих людей как её правильно решить!!!!!!  
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    В этом случае я бы посоветовал давать ссылку на задачу, чтобы все могли быстро понять, откуда эта задача. Да и читаемость задачи повысится. Если источника в интернете нет, можно хотя бы писать источник задачи (такое-то соревнование, такой-то год, к примеру). Это займет немного времени и избавит Вас от недопонимания.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      Может прописать в правилах, чтоб все сообщения типа "Помогите с задачей" сопровождались бы ссылками на условие и тд...
      • 14 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        А правил то сопсно и нет)
        • 14 лет назад, # ^ |
            Проголосовать: нравится +6 Проголосовать: не нравится
          У каждого они свои... Но когда вопрос о задаче сопровождается ссылкой на условие - это по-моему логично и исключает(?) "помощъ зала" в идущих соревнованиях