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 JavaScript (Node.js 12.16.1) (judge verdict: Accepted)

const input = require("fs").readFileSync("/dev/stdin", "utf8")
const lines = input.split('\n')
const [N, X, M] = lines[0].split(' ').map(Number)

let a = X
const map = {}
const loop = []
const pre = [a]
for (let i = 1; i < N; i++) {
    a = a * a % M
    if (map[a] === 2){
        break
    } else if (map[a]) {
        loop.push(a)
        pre.pop()
    } else {
        pre.push(a)
    }
    map[a] = (map[a] || 0) + 1
}

const suf = []
for (let i = 0; i < (N - pre.length) % (loop.length || 1); i++) {
    suf.push(loop[i])
}

const sum = loop.reduce((a, b) => a + b, 0)
const lt = loop.length ? Math.floor(((N - pre.length) / loop.length)) : 0

console.log(
    pre.reduce((a, b) => a + b, 0) +
    sum * lt +
    suf.reduce((a, b) => a + b, 0)
)