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)

using namespace std;
#include<bits/stdc++.h>
#define int long long
#define pb push_back 
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)

int mod;

signed main()
{
    IOS;
    int n,x,mod;
    cin>>n>>x>>mod;
    int freq[mod]={0};

    vector<int>sequence,cycle;
    
    int ans = 0;
    int rep;

    bool found = false;
    int init = 0;

    while(true)
    {
        if ( freq[x] )
        {
            //cerr<<"! "<<x<<endl;
            rep = x; 
            break;
        }

        freq[x] = 1;

        sequence.pb(x);

        x*=x;
        x%=mod;
    }

    for ( auto it: sequence )
    {
        if ( it == rep )
            found = true;

        if ( found )
            cycle.push_back(it);

        else
            ++init;
    }  

    for (int i=1; i<sequence.size(); ++i)
        sequence[i]+=sequence[i-1];

    for (int i=1; i<cycle.size(); ++i)
        cycle[i]+=cycle[i-1];

    if ( n<=sequence.size() )
        ans = sequence[n-1];
    
    else
    {
        if (init)
        ans = sequence[init-1];
        n-=init;
        int fct = n / cycle.size();
        int rem = n%cycle.size();
       // cerr<<"! "<<fct<<" "<<rem<<" "<<cycle.back()<<endl;
        ans+=fct*cycle.back();
        if ( rem )
            ans+=cycle[rem-1];
    }

    cout<< ans <<endl;
}