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>
typedef long long lint;
using namespace std;

struct loop_info {
    lint loop_len;
    lint prefix_len;
    lint unit;
};

lint n, x, m;

lint f(lint z) {
    return z * z % m;
}

lint simple_solve(lint start, lint k) {
    lint now = start;
    lint res = 0;
    for (int i = 0; i < k; i++) {
        res += now;
        now = f(now);
    }
    return res;
}

loop_info get_loop() {
    vector<lint> appear_time(m, -1);
    lint now = x;
    lint time = 0;
    loop_info res;
    while (true) {
        if (appear_time[now] == -1) {
            appear_time[now] = time;
            time++;
            now = f(now);
        } else {
            res.loop_len = time - appear_time[now];
            res.prefix_len = appear_time[now];
            res.unit = simple_solve(now, res.loop_len);
            return res;
        }
    }
}

int main() {
    cin >> n >> x >> m;
    auto loop = get_loop();
    if (n < loop.prefix_len) {
        cout << simple_solve(x, n) << endl;
    } else {
        lint loop_num = (n - loop.prefix_len) / loop.loop_len;
        lint rem = n - loop_num * loop.loop_len;
        lint ans = simple_solve(x, rem) + loop.unit * loop_num;
        cout << ans << endl;
    }
}