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;

#define mod 1000000007
#define ll long long int
#define mk make_pair
#define pb push_back
#define xx first
#define yy second
#define ar array
#define del 1e-8

template<typename T, typename U> static inline void amin(T &x, U y){ if(y<x) x=y; }
template<typename T, typename U> static inline void amax(T &x, U y){ if(x<y) x=y; }

double pi=3.141592653589793238;
const int M = 1e9+7;
const int Nmax=5005;
const int MM = 998244353;
const int N=1000005;


int main()
{
	//ios_base::sync_with_stdio(0), cin.tie(0);
	int T=1;
	//cin>>T;
	while(T--){
      ll n,x,m;
      cin>>n>>x>>m;
      ll ans=0;
      ll k=x;
      map<ll,ll> s;
      int flag=0;
      for(ll i=1;i<=n;i++){
        if(flag==0 && s.count(k)){
            flag=1;
            ll in=(i-s[k]);
            ll pc=0;
            ll kk=k;
            for(ll j=i;j<i+in;j++){
                pc+=kk;
                kk=(kk*kk)%m;
            }
            ll bulk=(n-i+1)/in;
            ans+=bulk*pc;
            i+=bulk*in;
        }
        ans+=k;
        if(flag==0)s[k]=i;
        k=(k*k)%m;
       // cout<<i<<" -=-\n";
      }
      cout<<ans<<"\n";
    }
	return 0;
}