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: Wrong Answer)

/*
 © 2020-09-19 08:02:22 Franco1010 All Rights Reserved
*/

#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
#define f first
#define s second
#define fore(i,a,b) for(int i = (a), ThxMK = (b); i < ThxMK; ++i)
#define pb push_back
#define all(s) begin(s), end(s)
#define _ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define sz(s) int(s.size())
#define ENDL '\n'
using namespace std;
typedef long double ld;
typedef long long lli;
typedef pair<lli,lli> ii;
typedef vector<lli> vi;
#define deb(x) cout << #x": " << (x) << endl;

int main(){ _
  lli n, x, m; cin >> n >> x >> m;
  vector<lli> v = {x};
  vector<lli> vv;
  set<lli> st = {x};
  lli res = x;
  fore(i, 1, n){
    x = (x * x) % m;
    if(st.count(x)){
      bool yes = false;
      fore(i, 0, sz(v)){
        if(v[i] == x) yes = true;
        if(yes) vv.pb(v[i]);
      }
      break;
    }
    st.insert(x);
    v.pb(x);
    res += x;
    if(x == 0){
      cout << res << ENDL;
      return 0;
    }
  }
  if(!vv.empty()){
    fore(i, 1, sz(vv)) vv[i] += vv[i - 1];
    n -= sz(v);
    lli aux = n / sz(vv);
    res += vv.back() * (n / sz(vv));
    if(n % sz(vv)) res += vv[n % sz(vv) - 1];
  }
  cout << res << ENDL;
  return 0;
}