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: Accepted)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxi = 1e6 + 1, mod = 998244353;
int fac[maxi];
ll modex(ll a, ll b, ll m)
{
    ll ans = 1;
    for(; b > 0; b >>= 1, a = (a * a) % m)
        if(b & 1)
            ans = (ans * a) % m;
    return ans;
}
int main()
{
    ll n, x, m, i;
    cin >> n >> x >> m;
    if(x == 0)
        cout << 0 << endl;
    else if(x == 1)
        cout << n << endl;
    else
    {
        ll p = 0, ele = -1;
        vector <int> a;
        set <int> s;
        while(1)
        {
            if(s.find(x) != s.end())
            {
                ele = x;
                p = s.size();
                break;
            }
            else
            {
                a.push_back(x);
                s.insert(x);
                x = (x * x) % m;
            }
        }
        for(i = 0; i < a.size(); i++)
        {
            if(a[i] == ele)
            {
                ele = i;
                break;
            }
        }
        ll ans = 0;
        if(a.size() >= n)
        {
            for(i = 0; i < n; i++)
                ans += a[i];
        }
        else
        {
            for(i = 0; i < ele; i++)
                ans += a[i];
            n -= max(0ll, ele);
            if(ele != -1)
            {
                p = a.size() - ele;
                for(i = ele; i < a.size(); i++)
                    ans += n / p * a[i];
                for(i = ele; i - ele < n % p; i++)
                    ans += a[i];
            }
        }
        cout << ans << endl;
    }
    return 0;
}