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)

#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define REPS(i, a, b) for (int i = (a); i < (b); ++i)
using namespace std;
using ll = long long;

int main() {
    
    // ここから入力
    ll n,ans = 0;
    ll x,m,b = 0,c = 0,d = 0,e = 0,f = 0,cnt = 1;
    cin >> n >> x >> m;
    vector<ll> a(m+1);
    vector<ll> aa;
    vector<int> checked(m+1,0);
    
  
  a[0] = x;
  checked[x] += 1;
    int i = 1;
    while(i < n){
        x = (x*x);
        x %= m;
      a[i] = x;
        cnt++;
        if(x == 0) break;
        if(checked[x] == 2){
          aa.push_back(x);
          b = i;
          c++;
          d += x;
        }
        if(checked[x] == 3){
            break;
        }
        
        checked[x] += 1;
        i++;
    }
 
  
    
    if(b == 0){
      REP(i,cnt){
        //cout << a[i] << endl;
           ans += a[i];
     }
    }
    else{
        REP(i,m+1){
            if(checked[i] == 1){
              //cout << i << endl;
                e++;
                ans += i;
            }
        } 
      
       //cout << ans << endl;
        n -= e;
        ll kakeru = n / c;
        ll amari = n % c;
      
        ans += d * kakeru;

        REP(i,amari){
            ans += aa[i];
        }
      //cout << kakeru << endl;
    }
    
    
   cout << ans << endl;
   
}