Search code examples
arraysalgorithmmathsumnumbers

Special Pairs in N natural number sequence


You are given a natural number N which represents sequence [1,2...N]. We have to determine the number of pairs (x,y) from this sequence that satisfies the given conditions.

  • 1 <= x <= y <= N
  • sum of first x-1 numbers (i.e sum of [1,2,3..x-1]) = sum of numbers from x+1 to y (i.e sum of [x+1...y])

Example:-
If N = 3 there is only 1 pair (x=1,y=1) for which (sum of x-1 numbers) = 0 = (sum of x+1 to y)
any other pairs like (1,2),(1,3) or (2,3) does not satisfy the properties. so the answer is 1 as there is only one pair.

Another Example:-
If N=10, for pair (6,8) we can see sum of x-1 numbers i.e [1,2,3,4,5] = 15 = sum of numbers from x+1 to y i.e [7,8], Also another such pair would be (1,1). No other such pair exists so the answer, in this case, would be 2.

How can we approach and solve such problems to find the number of pairs in such a sequence?

Other things I have been able to deduce so far:-

Condition Answer Pairs
If 1<=N<=7 1 {(1,1)}
If 8<=N<=48 2 {(1,1),(6,8)}
If 49<=N<=287 3 {(1,1),(6,8),(35,49)}
If 288<=N<=1680 4 -

I tried but am unable to find any pattern or any such thing in these numbers.
Also, 1<=N<=10^16


Solution

  • --edit--

    Courtesy of OEIS (link in comments): you can find the k'th value of y using this formula: ( (0.25) * (3.0+2.0*(2**0.5))**k ).floor

    This gives us the k'th value in O(log k). First few results:

    1
    8
    49
    288
    1681
    9800
    57121
    332928
    1940449
    11309768
    65918161
    384199200
    2239277041
    13051463048
    76069501249
    443365544448
    2584123765441
    15061377048200
    87784138523761
    511643454094368
    2982076586042447
    17380816062160312
    101302819786919424
    590436102659356160
    3441313796169217536
    20057446674355949568
    116903366249966469120
    681362750825442836480
    3971273138702690287616
    23146276081390697054208
    134906383349641499377664
    786292024016458181771264
    4582845760749107960348672
    26710782540478185822224384
    155681849482119992477483008
    907380314352241764747706368
    

    Notice that the ratio of successive numbers quickly approaches 5.828427124746. Given a value of n, take the log of n base 5.828427124746. The answer will be an integer close to this log.

    E.g., say n = 1,000,000,000. Then log(n, 5.8284271247461) = 11.8. The answer is probably 12, but we can check the neighbors to be sure.

    11:    65,918,161
    12:   384,199,200
    13: 2,239,277,041
    

    Confirmed.

    -- end edit --

    Here's some ruby code to do this. Idea is to have two pointers and increment the pointer for x or y as appropriate. I'm using s(n) to calculate the sums, though this could be done without multiplication by just keeping a running total.

    def s(n)
      return n*(n+1)/2
    end
      
      
    def f(n)
      count = 0
      x = 1
      y = 1
      while y <= n do
        if s(x-1) == s(y) - s(x)
          count += 1 
          puts "(#{x}, #{y})"
        end
        if s(x-1) <= s(y) - s(x)
          x += 1
        else
          y += 1
        end
      end
    end
    

    Here are the first few pairs:

    (1, 1)
    (6, 8)
    (35, 49)
    (204, 288)
    (1189, 1681)
    (6930, 9800)
    (40391, 57121)
    (235416, 332928)
    (1372105, 1940449)
    (7997214, 11309768)
    (46611179, 65918161)