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++ (GCC 9.2.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, x, m, stp, now, a, b, len, pos;
int vis[N];
int res[N];
signed main () {
    cin >> n >> x >> m;
    now = x;
    while (1) {
        if (vis[now]) {
            // cout << now << " " << vis[now] <<endl;
            // for (int i = 1; i <= stp; i++) cout << res[i] <<endl;
            for (int i = vis[now]; i <= stp; i++) b += res[i];
            for (int i = 1; i <= vis[now] - 1; i++) a += res[i];
            len = stp - vis[now] + 1;
            n -= vis[now] - 1; pos = vis[now];
            break;
        }
        res[++stp] = now;
        vis[now] = stp;
        now = now * now % m;
    }
    // cout << a << " " << b << " " << n << " " <<len << endl;
    int ans = a + b * (n / len);
    for (int i = 0; i <= (n % len) - 1; i++) ans += res[i + pos];
    printf ("%lld\n", ans);
    return 0;
}