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 <iostream>
#include <vector>
using namespace std;
using ll=long long;

int main() {
  ll n, x, m;
  cin >> n >> x >> m;
  vector<int> id(m, -1); // iが何回目に登場したか
  vector<int> list;
  
  // 周期を得るまで回す
  ll x1 = x;
  int len = 0;
  ll total = 0;
  while (id[x1] == -1) {
    list.push_back(x1);
    id[x1] = len;
    len++;
    total += x1;
    x1 = x1 * x1 % m;
  }
  int c = len - id[x1]; // 周期のノード数
  ll c_total = 0; // 周期の合計点数 
  for (int i=id[x1]; i<len; i++) c_total += list[i];
  
  ll ans = 0;
  ll x2 = x;
  if (n <= len) {
    for (int i=1; i<=n;i++) {
      ans += x2;
      x2 = x2*x2%m;
    }
  } else {
    // 周期を使える時
    ans += total;
    n -= len;  //残り回数
    ans += (n / c) * c_total;
    n %= c;
    for (int i=0; i<n; i++) ans += list[ id[x1] + i];
  }
  
  cout << ans;
}