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: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
#define rep(i,n) for(int (i)=0; (i) < (n); (i)++)

int main()
{
    ll N, X, M; cin >> N >> X >> M;
    ll tmp = X;
    ll ans = tmp;
    map<ll,ll> m;
    vector<ll> a;
    bool first = false;
    bool second = false;
    int index1 = 0;
    int index2 = 0;
    rep(i,N-1) {
        tmp = (tmp * tmp) % M;
        if (m[tmp]) { // ループあり？
            rep(j,a.size()) {
                if (a[j] == tmp) {
                    index1 = j;
                    break;
                }
            }
        }
        if (index1) {
            index2 = i;
            //cout << "j = " << index1 << endl;
            //cout << "i = " << index2 << endl;
            break;
        }
        m[tmp]++;
        a.push_back(tmp);
        //cout << "tmp = " << tmp << endl;
        ans += tmp;
        if (tmp == 0) break;
    }
    if (index1 == 0) {
        cout << ans << endl;
    }
    else {
        ll ans1 = X;
        for (int i = 0; i < index1; ++i) {
            ans1 += a[i];
        }
        ll nokori = N - (index1 + 1);
        ll num = nokori / (index2 - index1);
        //cout << "num = " << num << endl;
        ll amari = nokori % (index2 - index1);
        //cout << "amari = " << amari << endl;
        ll ans2 = 0;
        ll ac = 0;
        ll ans3 = 0;
        for (int i = index1; i < index2; ++i) {
            ans2 += a[i];
            ac++;
            if (ac != amari) {
                ans3 += a[i];
            }
        }
        ans2 *= num;
        
        //cout << ans1 << " " << ans2 << " " << ans3 << endl;
        cout << ans1 + ans2 + ans3 << endl;




    }

}