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, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define ALL(c) c.begin(), c.end()
#define SZ(c) (int) c.size()
#define DBG1(x) cout<<#x<<" = "<<x<<"\n"
#if USE_CP_REDIR
#define CP \
    freopen("input.txt","r", stdin); \
    freopen("output.txt","w", stdout);
#endif

using ll = long long;
using pii = pair<int,int>;

set<ll> visited;

inline ll next_f(ll a, ll M)
{
    return (a * a) % M;
}

int main()
{
ios::sync_with_stdio(false);
#ifdef CP
    CP;
#endif
    int N,X,M;
    cin >> N >> X >> M;
    ll ans = X;
    ll a = X;
    visited.insert(X);
    for(ll i = 2; i <= N;){
        a = next_f(a, M);
        //DBG1(a);
        if(a == 0) break;
        if(a == 1){
            ans += N - i + 1;
            break;
        }
        if(visited.count(a) > 0){
            //cout << "VISITED FOUND! a =" << a << endl;
            int L = SZ(visited);
            while( i + L <= N){
                ans *= L;
                i += L;
            }
            visited.clear();
        }else{
            visited.insert(a);
            ans += a;
            i++;
        }
        
    }

    cout << ans << endl;
}