Pagini recente » Cod sursa (job #598065) | Cod sursa (job #2824380) | Cod sursa (job #986200) | Cod sursa (job #2366121) | Cod sursa (job #1969673)
#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;
}