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

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

Есть поле размеров 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
  • Проголосовать: не нравится

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

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

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

15 лет назад, скрыть # |
 
Проголосовать: нравится +5 Проголосовать: не нравится
Заметим, что всего потребуется N-1 раз шагнуть вверх и M-1 - вправо. То есть маршруты различаются между собой только тем, в каких случаях мы будем передвигаться, например, вверх. Всего шагов будет N+M-2. Тогда количество маршрутов будет числом способов выбрать N-1 шаг из всех N+M-2. Допустим, мы выбрали какую-то комбинацию номеров шагов; тогда этой комбинации будет соответствовать маршрут, в котором на шагах с выбранными номерами мы идем вверх, на остальных - вниз. Каждая комбинация при этом будет соответствовать одному маршруту, и таким образом можно задать все маршруты. Значит, ответ - количество комбинаций из N+M-2 по N-1, или C(N+M-2, N-1).
15 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится
Любой путь из клетки [1, 1] в клетку [N, M] состоит ровно из N + M - 2 шагов. Из них N - 1 раз по одной оси, а M - 1 по другой. И тут в игру вступает комбинаторика. Ответом является число сочетаний из N + M - 2 по M - 1, что, в принципе, равно числу сочетаний из N + M - 2 по N - 1.
Ну а как это посчитать по непростому модулю - это другой вопрос. Я бы использовал такой подход: подсчитаем для каждого простого числа сколько раз оно входит в качестве множителя в числитель и знаменатель числа сочетаний. Факторизацию надо осуществлять, перебирая только простые делители, которые заранее можно получить с помощью решета Эратосфена.
15 лет назад, скрыть # |
 
Проголосовать: нравится +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.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Всем большое спасибо!!!!
15 лет назад, скрыть # |
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)
  • 15 лет назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится
    Если посмотреть на ограничения (N и M порядка 106), то массив размерности N x M мы не заведем. Более того, решение с оценкой времени выполнения O(NM) будет работать в лучшем случае 1000 секунд, а это означает, что даже если реализовать так, чтобы обходиться двумя строками матрицы, то все равно такое решение не зайдет. Учим комбинаторику!
15 лет назад, скрыть # |
 
Проголосовать: нравится +7 Проголосовать: не нравится
ээээ....эта задача какбэ на еще идущем заочном этапе кубка моей гимназии=)
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +4 Проголосовать: не нравится
    Сами виноваты, нечего давать баяны на официальные этапы. Пусть новые задачи придумывают.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +4 Проголосовать: не нравится

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

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

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

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