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;
using System.Linq;//リストの使用
using System.Collections.Generic;
using System.Text;//テキストの高速出力に必要
class Program
{
	static void Main()
	{
		string[] input = Console.ReadLine().Split(' ');
		long n = long.Parse(input[0]);
		long x = long.Parse(input[1]);
    long m = long.Parse(input[2]);

    int[] usedNums = new int[m];
    for(int i = 0; i < m; i++) usedNums[i] = -1;
    long[] sums = new long[m+1];
		long answer = 0;
    bool answered = false;
    long lastNum = x;

    for(int i = 0; i < (int)(m+1); i++)
    {
      //Console.WriteLine(i);
      if(usedNums[lastNum] != -1)
      {
        if(usedNums[lastNum] > 0)
        {
          answer += sums[usedNums[lastNum]-1];
          answer += (n-usedNums[lastNum])/(i-usedNums[lastNum])*(sums[i-1]-sums[usedNums[lastNum]-1]);

          if((n-usedNums[lastNum])%(i-usedNums[lastNum])!=0)
          {
            answer += sums[usedNums[lastNum]-1+((n-usedNums[lastNum])%(i-usedNums[lastNum]))]-sums[usedNums[lastNum]-1];
          }
        }else
        {
          answer += (n-usedNums[lastNum])/(i-usedNums[lastNum])*sums[i-1];

          if((n-usedNums[lastNum])%(i-usedNums[lastNum])!=0)
          {
            answer += sums[((n-usedNums[lastNum])%(i-usedNums[lastNum])) -1];
          }
        }
        
        answered = true;
        break;
      }
    
      usedNums[lastNum] = i;
      if(i == 0) sums[0] = x;
      else sums[i] = sums[i-1] +lastNum;

      lastNum = (lastNum*lastNum)%m;
      //Console.WriteLine(lastNum+"a");

      if(i >= n-1) break;
    }

		if(answered) Console.WriteLine(answer);
    else
    {
      Console.WriteLine(sums[n-1]);
    }
	}
}