Cod sursa(job #1969673)

Utilizator mihai2003LLL LLL mihai2003 Data 18 aprilie 2017 16:24:00
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <fstream>
#include <cstdio>
#include <memory.h>
#include <iostream>
using namespace std;
ifstream in("classictask.in");
ofstream out("classictask.out");
const int  NMAX=100;
class HugeN
{
private:
    long long x[NMAX];
public:
    void atrib(long long nr)
    {
        memset(x,0,sizeof(x));
        do
        {
            x[++x[0]]=nr%10;
            nr/=10;
        }
        while (nr);
    }
    long long ll()
    {
        long long nr=0;
        for(int i=x[0]; i>=1; i--)
            nr=nr*10+x[i];
        return nr;
    }
    HugeN()
    {
        memset(x,0,sizeof(x));
    }
    HugeN(long long nr)
    {
        memset(x,0,sizeof(x));
        do
        {
            x[++x[0]]=nr%10;
            nr/=10;
        }
        while (nr);
    }
    HugeN(const char *s)
    {
        int l=strlen(s);
        memset(x,0,sizeof(x));
        x[0]=0;
        for(l--; l>=0; l--)
            x[++x[0]]=s[l]-'0';
    }
    void get_huge();
    HugeN operator +(long long k)
    {
        long long trn,aux;
        trn=k;
        for(int i=1; i<=x[0]; i++)
        {
            aux=x[i]+trn;
            x[i]=aux%10;
            trn=aux/10;
        }

        while(trn)
        {
            x[++x[0]]=trn % 10;
            trn/=10;
        }
        return *this;
    };
    long long operator% (long long k);
    HugeN & operator*(const long long  k)
    {
        HugeN temp;
        long long  tr,i,aux;
        tr=0;
        temp.x[0]=x[0];
        for(i=1; i<=temp.x[0]; i++)
            temp.x[i]=x[i]*k;
        for(i=1; i<=temp.x[0]; i++)
        {
            aux=temp.x[i]+tr;
            temp.x[i]=aux%10;
            tr=aux/10;
        }
        while(tr)
        {
            aux=temp.x[0];
            aux++;
            temp.x[aux]=tr%10;
            tr/=10;
            temp.x[0]=aux;
        }
        return temp;
    };
};
long long HugeN::operator %(long long k)
{
    long long i;
    HugeN r(1LL*0);
    for (i=x[0]; i >= 1; i --)
        r=(r*10),r=r+x[i],r.atrib(1LL*r.ll()%k);
    return r.ll();
}

void HugeN::get_huge()
{
    int i;
    for (i=x[0]; i>=1; i--)
        out<<x[i];
}
int main()
{
    long long n,m,p,a;
    in>>n>>p>>m;
    HugeN res(1),aux;
    HugeN x(n);
    while(p)
    {
        a=x.ll();
        if( p & 1)
        {
            res=res*a,res.atrib(1LL*(res%m));
        }
        x=(x*a);
        x.atrib(x%m);
        p>>=1;
    }
   // res=res*1;
   // cout<<res%10;

    res.get_huge();
    return 0;
}