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 Python (3.8.2) (judge verdict: Accepted)

n,x,m = map(int,input().split())

cnt = 0
s = set()
L = []
for i in range(n):
    if i == 0:
        x = x%m
    else:
        x = x**2%m
    #print(x)
    if x == 0:
        break
    else:
        cnt += x
        if x not in s:
            s.add(x)
            L.append(x)
        else:
            l = L.index(x)
            restN = n - (i+1)
            restL = len(L)-l
            a = restN%restL
            
            loopcnt = 0
            restcnt = 0
            for j in range(restL):
                loopcnt += L[l+j]
                #print('loop:'+ str(L[l+j]))
                if j > 0 and j <= a:
                    restcnt += L[l+j]
            #print(i,loopcnt,restN,restL,restcnt)
            cnt += loopcnt*(restN//restL) + restcnt
            break
                

print(cnt)