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::{fastout, input};
use std::collections::HashSet;

#[fastout]
fn main() {
    input! {
        n: usize,
        x: usize,
        m: usize,
    }

    let mut set = HashSet::new();
    let mut seq = vec![];

    let mut prev = x;
    set.insert(prev);
    seq.push(prev);
    let mut last = None;
for _ in 1..n {
        let val = prev * prev % m;

        if set.contains(&val) {
            last = Some(val);
            break;
        }
        set.insert(val);
        seq.push(val);
        prev = val;
    }

    let cycle = if let Some(last) = last {
        let mut index = seq.len();
        for (i, &e) in seq.iter().enumerate() {
            if e == last {
                index = i;
                break;
            }
        };
        seq.split_off(index)
    } else {
        vec![]
    };

    let mut ans = seq.iter().sum::<usize>();
    if cycle.len() != 0 {
        let n = n - seq.len();
        let quo = n / cycle.len();
        let rem = n % cycle.len();
        ans += cycle.iter().take(rem).sum::<usize>();
        let sum_seq = cycle.iter().sum::<usize>();
        ans += sum_seq * quo;
    }

    println!("{}", ans);
}