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 Rust (1.42.0) (judge verdict: Accepted)

#![allow(
  non_snake_case,
  unused_variables,
  unused_assignments,
  unused_mut,
  unused_imports,
  unused_macros,
  dead_code
)]
use proconio::fastout;
use proconio::input;
use proconio::marker::*;
use std::cmp::*;
use std::collections::*;
//use std::collections::VecDeque;
macro_rules! debug {
  ($($a:expr),* $(,)*) => {
      #[cfg(debug_assertions)]
      eprintln!(concat!($("| ", stringify!($a), "={:?} "),*, "|"), $(&$a),*);
  };
}
#[fastout]
fn main() {
  input! {
    N:usize,X:usize,M:usize
  }
  let mut a = vec![0; M +1];
  let mut r = vec![M*2; M +1];
  a[0] = X;
  let mut start = 0;
  let mut end = 0;
  for i in 0..M  {
    r[a[i]] = i;
    a[i + 1] = a[i] * a[i] % M;
    if r[a[i + 1]] != M*2 {
      start = r[a[i+1]];
      end = i + 1;
      break;
    }
  }

  if end == 0 {
    let mut ans = 0;
    for i in 0..N {
      ans += a[i];
    }
    println!("{}", ans);
    return;
  }
  let mut ans = 0;
  for i in 0..start {
    ans += a[i];
  }
  let mut some = 0;
  for i in start..end {
    some += a[i];
  }
  let rep = (N - start) / (end - start);
  let amari = (N - start) % (end - start);
  ans += rep * some;
  for i in start..(start + amari) {
    ans += a[i];
  }
  println!("{}", ans);
}