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 Java (OpenJDK 11.0.6) (judge verdict: Wrong Answer)

import java.io.InputStream;
import java.io.PrintStream;
import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    resolve(System.in, System.out);
  }

  static void resolve(InputStream is, PrintStream pw) {
    Scanner sc = new Scanner(is);
    long n = Long.parseLong(sc.next());
    int x = Integer.parseInt(sc.next());
    int m = Integer.parseInt(sc.next());
    long ans = x;
    AnswerCache[] aToAnsCache = new AnswerCache[m];
    int count = 1;
    int a = x;
    aToAnsCache[a] = new AnswerCache(a, count, ans);
    boolean loopDetected = false;

    for (long i = 2; i <= n; i++) {
      a = (int) (((long) a * a) % m);
      count++;
      if (a == 0) {
        break;
      }
      if (!loopDetected && aToAnsCache[a] != null) {
        loopDetected = true;
        AnswerCache cache = aToAnsCache[a];
        int loopLength = count - cache.count;
        long remain = n - i;
        if (remain < 0) {
          ans += a;
          continue;
        }
        long loopCount = remain / loopLength;
        ans += (ans - cache.ans) * loopCount;
        ans += a;
        i += loopCount * loopLength;
      } else {
        aToAnsCache[a] = new AnswerCache(a, count, ans);
        ans += a;
      }
    }
    pw.println(ans);
  }

  static class AnswerCache {

    int a;
    int count;
    long ans;

    AnswerCache(int a, int count, long ans) {
      this.a = a;
      this.count = count;
      this.ans = ans;
    }

    @Override
    public String toString() {
      return "AnswerCache{" +
        "a=" + a +
        ", count=" + count +
        ", ans=" + ans +
        '}';
    }
  }
}