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

Всем привет!

Уже в эту субботу, 28 марта в 18:00 состоится первый квалификационный раунд Russian Code Cup 2015. Раунд продлится 2 часа. По итогам раунда 200 лучших выйдут в отборочный раунд, где сразятся за выход в финал.

Те, кому удача в субботу не улыбнется, а также те, кто по тем или иным причинам не смогут принять участие в раунде, смогут попробовать свои силы во втором отборочном раунде 25 апреля в 12:00, а при необходимости и в третьем – 31 мая в 13:00. В отборочный тур, назначенный на 13:00 14 июня, пройдут 200 лучших участников из каждого квалификационного раунда.

Для того чтобы принять участие в Russian Code Cup, нужно зарегистрироваться на сайте http://russiancodecup.ru/ (регистрация будет открыта до начала третьего квалификационного раунда).

Подробнее о чемпионате, правилах и призах и читайте на сайте http://russiancodecup.ru, по всем вопросам обращайтесь на [email protected]

Приглашаем всех принять участие в квалификационном раунде Russian Code Cup и желаем всем удачи!

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

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

А можно поинтересоваться, почему было решено отказаться от футболок для 600 лучших? Футболка куда круче сертификата, как мне кажется

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится -209 Проголосовать: не нравится

    Добрый день! от футболок решили отказаться в основном по двум причинам: во-первых, из-за больших сложностей с отправкой и доставкой футболок почтой и отсутствия возможности как-либо влиять на сроки и качество доставки, а так же негатив участников, возникающий из-за несвоевременного получения посылки. Наверняка здесь есть много участников RCC прошлого года, чья футболка так затерялась в недрах почты или по независящим от нас причинам была возвращена... Во-вторых, мы регулярно получаем просьбы и комментарии участников о желании получать сертификаты, подтверждающие участие или квалификацию.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +29 Проголосовать: не нравится

      Кстати, кто не получил футболку — напишите нам на [email protected] — отправим еще раз.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +87 Проголосовать: не нравится

      Дипломы тоже через почту?) Или пдф?

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +30 Проголосовать: не нравится

      А почему нельзя давать и футболку, и сертификат?

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +73 Проголосовать: не нравится

        Чтобы избавить участников от необходимости носить дополнительные тяжести с почты, вестимо.

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +124 Проголосовать: не нравится

        В таком случае негатива участников, возникающего из-за несвоевременного получения посылки будет в два раза больше. За футболку и еще за сертификат. Такого допустить нельзя, ни в коем случае.

        Ребята, только если кто-то сольет финал, то не говорите публично вещей вроде Обидно, что в призы не попал — а то в следующем году вообще призовой фонд отменят, во избежание подобного негатива.

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится +8 Проголосовать: не нравится

          Так сертификат-то в PDF, как я понял. Иначе какой смысл менять футболки на сертификаты, если все равно Почтой России доставляться будут?

          • »
            »
            »
            »
            »
            »
            9 лет назад, # ^ |
              Проголосовать: нравится +59 Проголосовать: не нравится

            Видимо, расчет на то, что если не дойдет сертификат, то никто не расстроится...

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +50 Проголосовать: не нравится

      Странно это, моя футболка в том году тоже потерялась, я написал письмо по другому поводу о ней и с удивлением узнал, что ее вообще мне не выслали. Ответили, сказали, что теперь выслали, пришла в течение двух недель чтоли. Никакого нигатива не осталось вообще, хотя удивился такому факапчику. Но факапы случаются, а решение выбрано странное. И так понятно, что самый гарантированный способ избежать ошибок — вообще ничего не делать.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +45 Проголосовать: не нравится

      Я бы сказал, что ожидание этих футболок не оправдывается их красотой и прекрасностью дизайна, удобства.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +18 Проголосовать: не нравится

      зато как мы радуемся, когда они приходят!

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

А всем по два одинаковых письма пришло?

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +37 Проголосовать: не нравится

    да, почта майл.ру работает надежнее почты России!

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +24 Проголосовать: не нравится

      Вот бы Почта России так работала!

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +44 Проголосовать: не нравится

      Тссс, а то на следующий год откажутся от рассылки уведомительных писем.

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

Блин, время неудобное, у меня уже планы есть на вечер. Может отменить квалсы в ближайшую субботу, чтобы я не расстраивался?

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Те, кому удача в субботу не улыбнется, а также те, кто по тем или иным причинам не смогут принять участие в раунде, смогут попробовать свои силы во втором отборочном раунде 25 апреля в 12:00, а при необходимости и в третьем – 31 мая в 13:00.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +90 Проголосовать: не нравится

    когда Russian Code Cup проводит контест вечером в субботу, в мире расстраивается один knst

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

Для того чтобы принять участие в Russian Code Cup, нужно зарегистрироваться на сайте http://russiancodecup.ru/ (регистрация будет открыта до начала третьего квалификационного раунда).

При этом, как я понял, после начала раунда на него зарегистрироваться уже нельзя: несмотря на то, что первый раунд идёт на данный момент всего семь минут, регистрироваться система предлагает только на второй.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +36 Проголосовать: не нравится

    значит, прошлогодний баг (у зарегистрировавшихся после начала раунда не было кнопки "отправить") исправили самым простым способом :)

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

У кого-нибудь была проблема со сдачей задач через Visual C++ 2013?

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

Я томат. Весь контест решал третью, но как будто чуваки сидят по кругу. =\

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +29 Проголосовать: не нравится

    Так вот почему у меня неправильно работает!! Спасибо =)

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

Раунд прошёл очень гладко, по сравнению с предыдущим годом. Спасибо большое организаторам!
Правда, очень раздражало прыгающее туда-сюда окно с задачами во время второго часа (об этом уже писали в комментариях к warm-up).

Задачи оказались интересными, но я смог решить только две. Придумал по четвёртой, как считать начальное количество способов, а с изменениями так и не вышло чего-то разумного. Предвкушаю поучительный разбор!

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

В четвертой у кого-то зашла корневая, или нужно было все же не халтурить и честно написать дерево отрезков?

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    У меня зашла корневая.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Так разрешён же prewritten code. Чего там писать, если есть template/generic класс дерева интервалов и класс матрицы?

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +39 Проголосовать: не нравится

    Я криворук, но у меня и ДО получило TL 2.

»
9 лет назад, # |
Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

Все фигня

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

Это нормально, что в задаче B зашло решение if x * y == z или я что-то не понимаю?

  • »
    »
    9 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +8 Проголосовать: не нравится

    [ignore previous message]

    А * у тебя — произведение чисел в системе счисления по основанию 10 или произведение полиномов?

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится

      Там вроде заходило простое умножение в десятичной системе счисления. На кф проверил.

      • »
        »
        »
        »
        9 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +56 Проголосовать: не нравится

        интересно тогда =), т.е. у них похоже нет тестов вида 4 4 16

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Да, из over9000 тестов там нет ни одного, в котором x*y==z в 10й системе, и чтобы перенос при длинном умножении был ненулевым.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Если у вас типы ограничены.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +20 Проголосовать: не нравится

      Произведение чисел в десятичной системе счисления.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Я думал примерно так: заменим числа x, y, z в равенстве полиномами с неизвестной базой w и коэффициентами, равными их цифрам. Раскроем скобки и перенесем неизвестные в одну сторону. Получим полином от w, который будет равен нулю при любом w тогда и только тогда, когда все его коэффициенты будут равны нулю. Что и означает x·y = z

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится

      Что и означает x·y = z

      А за что минусы? Все правильно человек написал. Только произведение не в десятичной системе счисления, а произведение полиномов x * y = z. Сверху уже упоминали банальный тест 4 4 16. Немного глупо, что некоторые джависты просто перемножили 2 биг-инта и сдали задачку :)

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

Как решать задачу E?

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +28 Проголосовать: не нравится

    Храним для всех возможных 0<=x<m ответ. Переход n->(n+1) это тупая динамика, а n->(2*n) это уже FFT по тому самому модулю. К счастью, модуль хороший: MOD-1 делится на 2^23. FFT с комплексными не заходит по точности.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +26 Проголосовать: не нравится

      У нас в команде gchebanov писал FFT по модулю, но через комплексные числа. Надо представить , где P(x) — многочлен с целыми коэффициентами  < p, P1(x), P2(x) — многочлены с целыми коэффициентами . Тогда перемножение двух обычных многочленов по модулю p можно выразить через четыре произведения многочленов с маленькими коэффициентами, и для них точности вполне хватает. Если не изменяет память, еще и работает быстрее, чем модульное FFT (впрочем, gchebanov поправит, если я наврал).

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится

        Да, именно так. Только не к 4м умножениям, а к 3м (по аналогии с Карацубой). Еще надо не забыть по модулю в конце взять.

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится +8 Проголосовать: не нравится

          И что, действительно быстрее работает? Плюс точность же зависит от размеров векторов, как я понимаю где-то до 220 хватает?

          • »
            »
            »
            »
            »
            »
            9 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Да, хватает, даже если использовать double. Производительность когда модуль порядка 10^18 не сравнивал — но по идее там уже должно побеждать хитрое умножение по модулю в сравнении с запуском 9-16 комплексных умножений. Большей частью преемущество достигаеться за счет того что на умножение в комплексном случае уходит две фурьешки, а в честном — три. В некоторых случаях это не нужно — например возведение в квадрат, там может сложиться по другому.

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          А как тремя умножениями если мы не возводим в квадрат, а умножаем разные полиномы? Работает кстати не быстрее по крайней мере у меня (4 умножения полиномов, каждое за 2 fft, в long double) ~2400ms против ~500ms в случае обычного fft по модулю если нам повезло с модулем (1 умножение за 3 fft, в int). В double точности не хватает.

          • »
            »
            »
            »
            »
            »
            9 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Как за 3 умножения: нужно посчитать
            (a0 + B·a1)·(b0 + B·b1) = a0·b0 + B·(a0·b1 + a1·b0) + B2·a1·b1.

            Пусть C = (a0 + a1)·(b0 + b1) (первое умножение).

            Тогда ответ a0·b0 + B·(C - a0·b0 - a1·b1) + B2·a1·b1.

            В double точности не хватает скорее всего потому, что каждый раз идёт домножение на и накапливается погрешность, если каждый раз считать угол, то всё нормально.

            Код со всем сказанным выше (и работает довольно быстро, даже с кучей векторов).

            • »
              »
              »
              »
              »
              »
              »
              9 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

              Да точно как в Карацубе. Переписал на то чтобы каждый раз угол пересчитывался (правда это надо в предподсчете делать а то очень медленно получается) и норм потери точности пропали 358ms (3 умножения по 2 fft в каждом, в double, ручной complex).

            • »
              »
              »
              »
              »
              »
              »
              9 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Можно вообще 4-мя Фурье обойтись: a0, b0, a1, b1 за 2 FFT переводим во frequency domain, объединяя в пары, и обратно тоже за одно FFT a0b0 и a1b1 переводим в time domain, за другое (a0 + a1)(b0 + b1).

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

Как решать C?

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

    Я решал через ДП по состоянию: 1. Кол-во пар, которые надо рассадить 2. Кол-во одиночных математиков, которые надо рассадить 3. Кол-во одиночных философов, которые надо рассадить 4. Кто был посажен последним (математик или филосов) 5. Кто был посажен предпоследним (математик или филосов) 6. Есть ли у посаженного последним напарник среди еще не рассаженных

    Пересчитывать за O(1) думаю понятно как

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Мне кажется или не стоит хранить "Кол-во пар, которые надо рассадить". Так как если мы смотрим на pos стул (нумерация с нуля), то "Кол-во пар, которые надо рассадить" равняется (2*n — pos — fil — math)/2, где fill = -это "Кол-во одиночных философов, которых надо рассадить", math — это "Кол-во одиночных математиков, которых надо рассадить".

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

        У меня в состоянии нет "pos стул". Эту позицию я вывожу из того, что есть.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Можно такой динамикой:

    dp[n1][n2][pairs][last][last_paired] — сколько способов расставить числа на первых n1+n2 местах, чтобы среди них было pairs пар одинаковых чисел, чтобы маска типов последних двух чуваков была last ( ≤  3), и что у последнего (была пара)/(не было пары). И математиков n1 и философов n2.

    Переход -- перебрать, кого из 2-х ставим, будем ли использовать число, которое уже было или не будем. Когда-то вычесть 1 случай, когда текущий равен последнему.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    ДП ([номер позиции на которую надо поставить очередного М или Ф], [число непосаженных математиков у которых парного им философа уже посадили], [число непосаженных философов у которых парного им математика уже посадили], [кто предыдущий-М или Ф], [кто пред-предыдущий-М или Ф], [поставлен ли предыдущим М или Ф из тех, чья пара уже выставлена]). итого 16 млн состояний при N=100 и переходы между ними что-то около O(1).

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Как решать задачу D?

  • »
    »
    9 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +13 Проголосовать: не нравится

    Если бы в задаче не было изменений — понятно, что можно написать простенькую динамику "сколькими способами можно валидно нарезать такой-то префикс".

    Как сюда прикрутить изменения? Сделаем дерево отрезков (да и корневая, как выше подтвердил Zhukov_Dmitry, тоже заходит, потом перепишу свою аккуратней:) для корневой можно посчитать ответы внутри каждого блока той же наивной динамикой), которое будет для каждого отрезка знать, сколько есть способов валидно нарезать этот отрезок без 0/1/2 символов слева/справа. При изменении нужно будет проапдейтить только логарифм отрезков. Как сливать такие отрезки? У отрезка-объединения слева будет столько свободных символов, сколько было свободных символов на префиксе у левого отрезка, справа — столько, сколько было свободных на суффиксе у правого; нужно перебрать, что происходит на стыке левого и правого отрезка — либо они просто сложились, либо же код какого-то числа был разбит на части, и попал и в суффикс левого отрезка, и в префикс правого (т.е. объедиение свободных символов суффикса левого отрезка и префикса правого отрезка дало нам валидный код). Так как коды у нас короткие, то все такие разбиения можно перебрать.

    А ответом будет число разбиений без свободных символов слева и справа для вершины-корня.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Кажется проще понимать так: вспомним как мы считаем динамику на префиксах, текущее состояние зависит от MAGIC = 3 предыдущих, причем линейно. Т.е. это просто умножение на какую-то матрицу, нам надо уметь изменять эти матрицы и считать произведение всех. Это можно делать деревом отрезков с обновлением в точке, ибо меняется всего MAGIC матриц.

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

N участников Russian Code Cup 2015 расстроились. Найдите количество способов расстроить именно такое количество человек. Ответ может быть очень большим, поэтому требуется найти его по модулю 10^9 + 7.

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

Вместо Infinity выводил Infinite и полтора часа сидел над ошибкой( В итоге забил на раунд и не прошел квалификацию(

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    А что приходило? PE?

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Ну по wa/pe на первом тесте можно было догадаться, что что-то здесь не так

    (а еще можно тулзы использовать, которые сами на тестах проверят :) )

»
9 лет назад, # |
  Проголосовать: нравится -42 Проголосовать: не нравится

Впервые вижу на контесте long arithmetic, пришлось вспоминать Java и его ввод-вывод — дискриминация по языку. Еще как-то кривенько сделана сложность задач — хотя бы две задачи решили куча человек, хотя бы три задачи сдали куда меньше, за счет чего в раунд проходят не те, кто больше рубит, а кто быстрее нагуглил "Java BigInteger example", имея установленный eclipse :)

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +44 Проголосовать: не нравится

    BigInteger... дааааа :)

    for (int i = 0; i<yl; ++i)
    {
            int kof = y[yl - 1 - i] - '0';
    	for (int j = 0; j < xl; ++j)
    	{
    	     temp[i + j] += kof*(x[xl-1-j]-'0');
    	}
    }
    
    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится -56 Проголосовать: не нравится

      Ага, а в питоне вообще считал два числа с 1000 знаков и просто вывел (a*b), без никакого BigInteger. Дело не в том, знаю ли я алгоритм умножения числа на число, а в том, что нормальный проблемсеттер не допустит, чтобы один и тот же алгоритм, который требуется в задаче, был доступен изначально в одном языке, и не был доступен в другом

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +26 Проголосовать: не нравится

        Вообще там не должно заходить a*b — выше читай.

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится

        На паскале нет встроенных сортировок! Дискриминация по языку!

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          На паскале вообще ничего нет. Никто не виноват, если вы его используете и каждый раз заново пишете аналог STL :)

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

            Полный абсурд. Такое можно говорить и про плюсы относительно питона. Никто не виноват, что Вы пишете на плюсах и не умеете писать сортировки / длинку за 1 минуту. (особенно, когда стандартная длинка питона и джавы не должны были заходить)

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

              Есть стандартный способ, не использующий длинку — посчитать все по N случайным простым модулям.

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

Это нормально, что (как я понял) у них на сервере не подключена ссылка на System.Numerics (MSVS C#) и соответственно, когда я подключал (для использования BigInteger) оно мне кидало ошибку компиляции? Соотвественно я убил кучу времени, потом осознал, что такое решение (x*y==z) неверное (хотя и заходило) и переписал с огромным штрафом

P.S.: код посылки я уже не найду, но если та посылка проходила тесты, то я проходил в следующий раунд

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Да, это нормально, к сожалению, хоть и не хорошо. Я для таких вещей пишу инкапсулятор для программы. Т.е. программу, которая загружает сборку другой программы из массива байт и вызывает в этой сборке функцию Main.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится

      А это законно (не противоречит правилам)? И можно код, пожалуйста.

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +13 Проголосовать: не нравится

        Обычно законно, но на CF такое, я думаю, нельзя использовать, так как данный метод можно считать обфускацией.

        Вот код загрузчика из памяти

        using System.Reflection;
        
        namespace MemoryRun
        {
            class MainClass
            {
                static byte[] assembly = new byte[] { };
                public static void Main(string[] args)
                {
                    var asm = Assembly.Load(assembly);
        
                    MethodInfo entry = asm.EntryPoint;
                    if (entry.GetParameters().Length == 0)
                    {
                        entry.Invoke(null, new object[0]);
                    }
                    else
                    {
                        entry.Invoke(null, new object[] { args });
                    }
                }
            }
        }
        

        А вот код инкапсулятора:

        using System;
        using System.IO;
        
        namespace Encapsulation
        {
            class MainClass
            {
                const string head = "using System.Reflection;\n\nnamespace MemoryRun\n{\n    class MainClass\n    {\n        static byte[] assembly = new byte[] {";
                const string foot = "};\n        public static void Main(string[] args)\n        {\n            Assembly asm = Assembly.Load(assembly);\n            MethodInfo entry = asm.EntryPoint;\n            if (entry.GetParameters().Length == 0)\n            {\n                entry.Invoke(null, new object[0]);\n            }\n            else\n            {\n                entry.Invoke(null, new object[] { args });\n            }\n        }\n    }\n}";
        
                public static void Main(string[] args)
                {
                    if (args == null || args.Length == 0)
                    {
                        Console.WriteLine("Args is empty");
                        return;
                    }
                    string path = args[0];
        
                    var assembly = File.ReadAllBytes(path);
        
                    var bytes = string.Join(",", assembly);
                    var code = head + bytes + foot;
        
                    File.WriteAllText(path + ".cs", code);
                }
            }
        }
        
        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Непонятно как это использовать применительно к System.Numerics, но вы подали мне идею:

          var assembly = Assembly.Load("System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089");
          var type = assembly.GetType("System.Numerics.BigInteger");
          var instance = Activator.CreateInstance(type, 2);
          Console.WriteLine(type.GetMethod("Pow").Invoke(null, new [] {instance, 100}));   
          

          Выводит 2^100, аналогично доступны остальные методы, работает для CodeChef/SPOJ/ideone, Codeforces(Mono) и Яндекс.Контест - везде System.Numerics не подключена. Нет возможности проверить на RCC, но скорее всего будет работать.

          • »
            »
            »
            »
            »
            »
            9 лет назад, # ^ |
            Rev. 3   Проголосовать: нравится +5 Проголосовать: не нравится

            Да, подобный метод я тоже рассматривал, но вы же понимаете, что рефлексия — дело не очень быстрое? По тому лучше раз загрузить сборку и выполнить.

            А теперь объясню, как работает мой метод. Дело в том, что вы можете скомпилировать программу у себя на машине, указав в ней ссылки на нужные библиотеки. Затем эта сборка загружается из памяти и подгружает все, что используется и было указано при компиляции.

            Т.е. я просто компилирую код у себя, ссылаясь на System.Numerics, а затем отправляю байт-код скомпилированной программы в исходном коде, который отправляю в систему

            • »
              »
              »
              »
              »
              »
              »
              9 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Понял теперь, хитро :) Выглядеть такой сабмит действительно подозрительно будет.