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)

use proconio::input;
#[allow(unused_imports)]
use proconio::marker::*;
#[allow(unused_imports)]
use std::cmp::*;
#[allow(unused_imports)]
use std::collections::*;
#[allow(unused_imports)]
use std::f64::consts::*;

#[allow(unused)]
const INF: usize = std::usize::MAX / 4;
#[allow(unused)]
const M: usize = 1000000007;

#[allow(unused_macros)]
macro_rules! debug {
    ($($a:expr),* $(,)*) => {
        #[cfg(debug_assertions)]
        eprintln!(concat!($("| ", stringify!($a), "={:?} "),*, "|"), $(&$a),*);
    };
}

fn main() {
    input! {
        n: usize,
        x: usize,
        m: usize,
    }
    if n < 10000000 {
        let mut res = x;
        let mut y = x;
        for _ in 1..n {
            y = y * y % m;
            res += y;
        }
        println!("{}", res);
        return;
    }

    let mut a = vec![];
    let mut a_set = HashSet::new();
    let mut y = x;
    while !a_set.contains(&y) {
        a.push(y);
        a_set.insert(y);
        y = y * y % m;
    }
    if n <= a.len() {
        let mut result = 0usize;
        for i in 0..n {
            result += a[i];
        }
        println!("{}", result);
        return;
    }
    debug!(a, y);
    debug!(a_set);
    let start = (0..a.len()).filter(|&i| a[i] == y).nth(0).unwrap();
    let cycle = a.len() - start;
    debug!(start, cycle);
    debug!(n / cycle, n % cycle);
    let mut result = 0usize;
    for i in 0..cycle {
        result += a[start + i];
    }
    result *= (n - start) / cycle;
    debug!(result);
    for i in 0..min(n, start) {
        result += a[i];
    }
    debug!(result);
    if n >= start {
        for i in 0..(n - start) % cycle {
            result += a[start + i];
        }
    }
    println!("{}", result);

    // let mut res = x;
    // let mut y = x;
    // for _ in 1..n {
    //     y = y * y % m;
    //     res += y;
    // }
    // debug!(result, res, max(result, res) - min(result, res));
}