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: Wrong Answer)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace contest_Csharp
{

    class Program
    {
        public static (long m, long s)[,] dp;
        public static long mod;


        static void Main(string[] args)
        {
            checked
            {
                var sw = new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
                Console.SetOut(sw);

                var vals = Console.ReadLine().Split(' ')
                    .Select(x => long.Parse(x)).ToList();


                var N = vals[0];
                var X = vals[1];
                var M = vals[2];
                var checker =new int[M + 1];
                
                long ans = 0;

                long subans = 0;
                long A = X;
                long span=0;
                int si=0;
                long sa=0;
                bool flg=false;
                for (int i = 0; i<N ; i++)
                {
                    checker[A] = i+1;
                    subans += A;
                    A = (A * A) % M;
                    if (checker[A] != 0)
                    {
                        span = i - checker[A]+2;
                        si = i;
                        sa = A;
                        flg = true;
                        break;
                    }
                }
                if (flg)
                {
                    long[] As = new long[span+1];
                    As[0] = 0;
                    for (int i = 1; i < span+1; i++)
                    {
                        As[i] = As[i - 1] + sa ;
                        sa = sa * sa % M;
                    }
                    ans = subans + ((N - si - 1) / span) * As[span ] + As[(N - si - 1) % span];
                }
                

                Console.WriteLine(ans);

                Console.Out.Flush();
            }//cheked

        }
        
    }

}