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

Автор challangeguy_as, история, 7 лет назад, По-русски

Всем привет! Хотел спросить как можно сделать предпосчет всех чисел, которые имеют 2 простых делителя без применения bruteforce ? Пожалуйста помогите мне с этим !

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

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

У знаю как за N2 (где N — количество простых делителей до определенного M)

Перебираем первый делитель ( пускай это будет x), перебираем второй делитель ( пускай это будет y), в какой-нибудь массив добавляем x * y.

p.s скорее всего быстрее будет за

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

    Не плохой алгоритм ,намного лучше чем я хотел. Но было бы очень хорошо если можно было бы это сделать лучше N^2 .Всё равно спасибо Dalgerok ! Я попробую написать.

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

      Количество простых чисел до M приблизительно равно .

      Значит мой алгоритм приблизительно сделает операций.

      Только что проверил, мой алгоритм на числах M >= 5504 делает в среднем больше операций, чем обычный bruteforce за .

      Видимо функция в первом случае растет быстрее, чем во втором.

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

Можно решетом Эратосфена найти все такие числа, меньшие n, за .

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

    А разве решето Эратосфена ,не для нахождения простых чисел qoo2p5 ? Просто как сделать с Эратосфена ,я не знаю.

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

      Когда находишь простое число p, рассматривай числа p, 2p, 3p, ... и к их счётчику количества простых делителей прибавляй 1.

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

        Разве это не O(nlogn)?

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

          Доказательство оценки тут.

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

            Но ведь там рассматриваются числа p^2,p^2+p...

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

              Это не правда. В обоих случаях будет .

              Я ведь специально отправил ссылку на статью с доказательством.

              Также можно проверить экспериментально. Для n = 109 получается примерно 3.2n просмотров чисел.

              UPD. Изначально отвечал на другой комментарий, который был удалён.

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

Напишем линейное решето (находящее для каждого числа минимальное простое), после этого все такие подобные вещи тоже делаются за O(N) проходом слева направо (и возможно запомнианием какой-то ДП)

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

    Ну через решето Эратосфена найти простые числа , а потом как можно в массив занести меньше за O(n^2) riadwaw ?

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

      тут вопрос, что значит "два простых"? Если это значит число вида pq (или p^2), то

      bool is_good(int n) {
         if (n == 1) return false; //1
         n /= lp[n];
         if (n == 1) return false; //n == p
         n /= lp[n];
         if (n == 1) return true; // 2 простых
         return false; // больше чем 2 простых.
      }
      

      Если подразумевается, кол-во различных простых, то при n >= 2

      cnt_different[n] = cnt_dirrerent[n / lp[n]] + (lp[n] != lp[n / lp[n]] ? 1 : 0);

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

        Ну вы верно поняли riadwaw . То есть у этих чисел должно быть ровно два простых делителя.

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

          так я два варианта понимания привёл :)

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

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