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

// Solution for https://atcoder.jp/contests/abc179/tasks/abc179_e

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

type contest struct {
	in  io.Reader
	out io.Writer
}

func (con *contest) Scan(a ...interface{}) (int, error) {
	return fmt.Fscan(con.in, a...)
}
func (con *contest) Scanln(a ...interface{}) (int, error) {
	return fmt.Fscanln(con.in, a...)
}
func (con *contest) Scanf(f string, a ...interface{}) (int, error) {
	return fmt.Fscanf(con.in, f, a...)
}
func (con *contest) Print(a ...interface{}) (int, error) {
	return fmt.Fprint(con.out, a...)
}
func (con *contest) Println(a ...interface{}) (int, error) {
	return fmt.Fprintln(con.out, a...)
}
func (con *contest) Printf(f string, a ...interface{}) (int, error) {
	return fmt.Fprintf(con.out, f, a...)
}
func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()
	con := &contest{in: in, out: out}
	con.main()
}

func (con *contest) main() error {
	var N, X, M int
	con.Scan(&N, &X, &M)
	mods := make([]int, M)
	for i := 0; i < M; i++ {
		mods[i] = -1
	}
	var p, q, r, s int
	for r = X; mods[r] < 0; r = (r * r) % M {
		mods[r] = q
		q++
	}
	aTotal := 0
	aSum := make([]int, M+1)
	for s = X; s != r; s = (s * s) % M {
		aTotal += s
		aSum[p+1] = aSum[p] + s
		p++
	}
	bTotal := 0
	bSum := make([]int, M+1)
	for i := p; i < q; i++ {
		bTotal += s
		bSum[i-p+1] = bSum[i-p] + s
		s = (s * s) % M
	}
	if N < p {
		con.Println(aSum[N])
	} else {
		x := (N - p) / (q - p)
		y := (N - p) % (q - p)
		con.Println(aTotal + bTotal*x + bSum[y])
	}
	return nil
}