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 Go (1.14.1) (judge verdict: Accepted)

package main

import "fmt"

func main() {
	var n, x, m int
	fmt.Scan(&n, &x, &m)

	ans := 0
	ss := make(map[int]int)
	done := make(map[int]int)
	a := x
	ss[1] = a
	done[a] = 1
	ans += a
	for i := 2; i <= n; i++ {
		a = ((a % m) * a) % m
		ss[i] = ss[i-1] + a
		if done[a] > 0 {
			l, r := done[a], i
			s := ss[r-1] - ss[l-1]
			rem := n - r + 1
			sl := r - l
			ans += s * (rem / sl)

			x := rem % sl
			ans += ss[l+x-1] - ss[l-1]
			break
		}
		done[a] = i
		ans += a
	}
	fmt.Println(ans)
}