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 (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func next() string {
	sc.Scan()
	return sc.Text()
}

func nextInt() int {
	a, _ := strconv.Atoi(next())
	return a
}

func main() {
	buf := make([]byte, 1024*1024)
	sc.Buffer(buf, bufio.MaxScanTokenSize)
	sc.Split(bufio.ScanWords)

	N, X, M := nextInt(), nextInt(), nextInt()
	A := make([]bool, M)
	B := make([]int, 0)
	x := X
	y := -1
	for {
		if A[x] {
			y = x
			break
		}
		B = append(B, x)
		A[x] = true
		x = (x * x) % M
	}
	b_ind := -1
	for j, b := range B {
		if b == y {
			b_ind = j
			break
		}
	}
	total := 0
	if N < b_ind {
		for i := 0; i < N; i++ {
			total += B[i]
		}
	} else {
		for i := 0; i < b_ind; i++ {
			total += B[i]
		}
		ring_len := len(B) - b_ind
		ring_count := 0
		for i := b_ind; i < len(B); i++ {
			ring_count += B[i]
		}
		total += ring_count * ((N - b_ind) / ring_len)

		rem := (N - b_ind) % ring_len
		for i := 0; i < rem; i++ {
			total += B[b_ind+i]
		}
	}
	fmt.Println(total)
}