Problem:
Score : 500 points

Problem Statement

Let us denote by f(x, m) the remainder of the Euclidean division of x by m.

Let A be the sequence that is defined by the initial value A_1=X and the recurrence relation A_{n+1} = f(A_n^2, M).
Find \displaystyle{\sum_{i=1}^N A_i}.

Constraints

1 \leq N \leq 10^{10}

0 \leq X < M \leq 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N X M

Output

Print \displaystyle{\sum_{i=1}^N A_i}.

Sample Input 1

6 2 1001

Sample Output 1

1369

The sequence A begins 2,4,16,256,471,620,\ldots Therefore, the answer is 2+4+16+256+471+620=1369.

Sample Input 2

1000 2 16

Sample Output 2

6

The sequence A begins 2,4,0,0,\ldots Therefore, the answer is 6.

Sample Input 3

10000000000 10 99959

Sample Output 3

492443256176507

Solution in Scala (2.13.1) (judge verdict: Accepted)

object Main extends App {
  val sc = new java.util.Scanner(System.in)
  val n = sc.nextLong()
  val x, m = sc.nextInt()

  val a = Array.fill(m)(0L)
  val idx = Array.fill(m)(-1)

  var i = 0
  var now = x.toLong
  while (idx(now.toInt) == -1) {
    idx(now.toInt) = i
    a(i) = now
    now = (now * now) % m
    i += 1
  }

  val s = idx(now.toInt)
  val e = i - 1
  val l = e - s + 1
  val ac = a.scanLeft(0L)(_+_)
  var ans = 0L

  if (n < s) {
    ans += ac(n.toInt)
  } else {
    var r = n
    ans += ac(s)
    r -= s

    ans += (ac(e+1) - ac(s)) * (r / l)
    ans += ac(s + (r % l).toInt) - ac(s)
  }

  println(ans)
}