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 C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System.Collections.Generic;
using System;

public class Hello
{
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var n = long.Parse(line[0]);
        var x = int.Parse(line[1]);
        var m = int.Parse(line[2]);
        getAns(n, x, m);
    }
    static void getAns(long n, int x, int m)
    {
        var a = new long[m];
        var b = new long[m + 1];
        a[0] = x;
        b[1] = x;
        var d = new Dictionary<long, int>();
        d[x] = 0;
        var p = 1;
        while (p < m)
        {
            var w = (a[p - 1] * a[p - 1]) % m;
            a[p] = w;
            b[p + 1] = b[p] + a[p];
            if (!d.ContainsKey(w)) d[w] = p;
            else
            {
                var dw = d[w];
                var loopc = p - dw;
                var loopv = b[p] - b[dw];
                var toloopv = b[dw];
                var time = (n - dw) / loopc;
                var toend = (n - dw) % loopc;
                var toendv = b[dw + toend] - b[dw];
                var ans = toloopv + time * loopv + toendv;
                Console.WriteLine(ans);
                return;
            }
            p++;
        }
        Console.WriteLine(b[m - 1]);
    }
}