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: Runtime Error)

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i, n) for (int i = 0; i < (int)(n); i++)
    #define rrep(i, n) for(int i = n-1; i >= 0; i--)
    #define  all(x) (x).begin(),(x).end()     // 昇順ソート
    #define  rall(v) (v).rbegin(), (v).rend() // 降順ソート
    #define  FastIO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    typedef long long ll;
    using P = pair<int,int>;
    using VI = vector<int>;
    using VVI = vector<vector<int>>;
    using VL = vector<ll>;
    using VVL = vector<vector<ll>>;
    using VP = vector<P>;
    template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
    template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return true; } return false; }

    int main(){
        ll n, x, m;
        cin >> n >> x >> m;

        VL r(m);
        deque<ll> dq;
        rep(i,n) {
            r[x]++;
            dq.push_back(x);
            x *= x;
            x %= m;

            // 巡回検出
            if (r[x] != 0) break;
        }

        // 残りの数
        n -= dq.size();

        if (n != 0){
            // ループサイズ
            // while(dq.front() != x) dq.pop_front();
            ll loop_sz = dq.size();

            // 何回ループするかを計算し、ループする数に対して加算する
            ll nq = n / loop_sz;
            while(!dq.empty()){
                ll y = dq.front(); dq.pop_front();
                r[y] += nq;
            }

            // 残りは普通に計算する
            ll nr = n % loop_sz;
            while(nr--){
                r[x]++;
                x *= x;
                x %= m;
            }
        }

        ll ans = 0;
        rep(i,m) ans += (ll)i * r[i];
        cout << ans << endl;
        return 0;
    }