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

Автор abbi_18, история, 7 лет назад, По-английски

I recently saw a question and was stuck on it for quite some time. Let's say if there are 'n' people standing is a circle. Now I will talk to the 1st person, then skip next 'a' people and talk to (a+2)-th person. I am supposed to calculate the number of people I have to talk to, before I can talk to the 1st person again.

Eg 1: The number of people = 10. The number of people to skip = 3.

so, the order in which I will go to people is -> 1 5 9 3 7 1 here, we can see that I had to go through 4 people to reach to 1 again.

Eg 2: The number of people = 10. The number of people to skip = 1

the order to reach out to people -> 1 3 5 7 9 1 here, 4 people were visited before reaching to 1 again.

Now the naive approach to solving this problem will be to iterate over the array but that will give me a time complexity of O(n) but if the number of people standing in the circle is of the order 10^18. This will not work.I think a better way to approach this problem would be by the help of gcd operation but I am not able to figure out the correct specifics of that approach. Also, Is there a approach to solve these type of questions.

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

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

Constraints on a? If it is less than 107, then there is an O(N) solution that would be fast enough.

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

    Thanks for commenting, Rishi. Although that would be correct; I am looking for a solution which will be work in O(1) or at least in O (log n).

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

      Isn't the first sequence wrong? 1, 5, 9, the next number should be 3. Coz we skip 10, 1 and 2.

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

        Yes, It should be. I corrected it now. Thanks

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

          If what I understood is correct, the answer to the problem is

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

            Here is the proof:

            We need to visit 1 again. Let us suppose we visit it after going over the array [1, n], t times. To make it clear, t means how many times you skip the nth person.

            So you need to solve this equation for x(can be obtained by analysing a simple AP):

            t × n + 1 = 1 + (x - 1) × (a + 1).

            Therefore .

            For this to be an integer, t should be .

            Here x will give us the xth term of A.P., so we need to subtract 2 because you want to find out how many terms you skip.

            So substituting t and subtracting 2, we get

            .

            You might need to handle some corner cases, haven't given much thought.

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

            Yes, This will work. I was just looking around gcd but was not able to figure out this particular expression. Thanks for the help :)

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

Auto comment: topic has been updated by abbi_18 (previous revision, new revision, compare).