Pagini recente » Cod sursa (job #742665) | Cod sursa (job #846301) | Cod sursa (job #2257224) | Cod sursa (job #918813) | Cod sursa (job #2388796)
#include <cstdio>
#include <cstring>
#include <iostream>
#define DEBUG 0
#define DIM 200010
using namespace std;
int b[DIM];
long long calcul[DIM],solve[DIM];
char a[DIM], s[DIM];
void updcf (int &elem,int cf){
b[elem+1]=cf%2;
cf/=2;
b[elem+2]=cf%2;
cf/=2;
b[elem+3]=cf%2;
cf/=2;
b[elem+4]=cf%2;
cf/=2;
elem+=4;
}
int main()
{
FILE *fin=fopen ("calcul.in","r");
FILE *fout=fopen ("calcul.out","w");
int x,elem,i,c;
long long n,mod;
fgets (a,DIM,fin);
x=strlen(a)-2;
fgets (s,DIM,fin);
elem=0;
for (i=strlen(s)-2;i>=0;i--){
if ('0'<=s[i] && s[i]<='9')
updcf(elem,s[i]-'0');
else updcf(elem,10+s[i]-'A');
}
fscanf (fin,"%d",&c);
n=0;
mod=1;
for (i=1;i<=c;i++)
mod=(mod*10);
for (i=max(0,x-c+1);i<=x;i++){
n=n*10+(a[i]-'0');
}
/// n ^ 1 + ... + n ^ b
while (b[elem]==0)
elem--;
for (i=elem;i;i--){
if (i==elem)
calcul[i]=n; /// n ^ (2^0)
else{
calcul[i]= (calcul[i+1] * calcul[i+1])%mod ;
if (b[i]==1)
calcul[i]=( calcul[i]* n)%mod;
}
}
/// calcul[i] = n ^ [ nr format din b cu i .. elem ]
/// b[elem] = cel mai semnificativ
/// calcul vector solve[i], solutia pt bitii i,elem
for (i=elem;i;i--){
if (b[i]==1){ /// b impar
solve[i]= (solve[i+1] * (1 + calcul[i+1]))%mod;
solve[i]= (solve[i]*n)%mod;
solve[i]=(solve[i]+n)%mod;
}
else { /// b par
solve[i] = (solve[i+1] * (1 + calcul[i+1]))%mod;
}
}
int c2=solve[1],cf=0;
if (c2==0)
cf=1;
while (c2){
cf++;
c2/=10;
}
for (i=cf+1;i<=c;i++)
fprintf (fout,"0");
fprintf (fout,"%lld",solve [1]);
return 0;
}