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 Kotlin (1.3.71) (judge verdict: Accepted)

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PrintWriter
import kotlin.math.max

val br = BufferedReader(InputStreamReader(System.`in`))
val out = PrintWriter(System.out)

fun main() {
    br.use { out.use {
        solve()
        out.flush()
    } }
}

fun solve() {
    val (n, x, m) = readLongList()

    // 何個目の項からループするのかを求める
    val indexMap = mutableMapOf<Long, Int>()
    var cur = x
    var curIndex = 0
    while (indexMap.containsKey(cur) == false) {
        indexMap[cur] = curIndex
        curIndex++
        cur = cur * cur % m
    }
    val loopFromIndex = indexMap[cur]!!
    
    // ループする前の合計、1ループの合計、1ループの項数
    val sumBeforeLoop = indexMap.filter { it.value < loopFromIndex }.keys.sum()
    val sumOneLoop = indexMap.filter { it.value >= loopFromIndex }.keys.sum()
    val oneLoopSize = indexMap.count() - loopFromIndex

    // ループ開始後のn、ループする数、ループ終了後のn
    val nAfterStartLoop = max(0, n - loopFromIndex)
    val loopCount = nAfterStartLoop / oneLoopSize
    val nAfterEndLoop = nAfterStartLoop % oneLoopSize

    var ans = if (n <= loopFromIndex) 0 else sumBeforeLoop + loopCount * sumOneLoop

    var pre = if (n <= loopFromIndex) x else cur
    val simulateCount = if (n <= loopFromIndex) n.toInt() else nAfterEndLoop.toInt()
    repeat(simulateCount) {
        ans += pre
        pre = pre * pre % m
    }

    out.println(ans)
    return
}

fun readInteger() = Integer.parseInt(br.readLine())
fun readLong() = java.lang.Long.parseLong(br.readLine())
fun readStringList() = br.readLine()!!.split(' ')
fun readIntegerList() = readStringList().map(Integer::parseInt)
fun readLongList() = readStringList().map(java.lang.Long::parseLong)
fun readDoubleList() = readStringList().map(java.lang.Double::parseDouble)