Pagini recente » Cod sursa (job #1597946) | Cod sursa (job #2017059) | Istoria paginii runda/prega_30_dec/clasament | Monitorul de evaluare | Cod sursa (job #274368)
Cod sursa(job #274368)
#include <stdio.h>
#include <bitset>
#define M 1000000000
using namespace std;
int l,i,c;long long a;
bitset <200050> p;
char A[100005],nr;
long long power(){
long long b[2][2],r[2][2],aux[2][2]; int i;
b[0][0]=a;b[0][1]=a;
b[1][0]=0;b[1][1]=1;
r[0][0]=1;r[0][1]=0;r[1][0]=0;r[1][1]=1;
for (i=l-1;i>=0;--i){
if (p[i]){
aux[0][0]=r[0][0]*b[0][0]+r[0][1]*b[1][0];
aux[0][1]=r[0][0]*b[0][1]+r[0][1]*b[1][1];
aux[1][0]=r[1][0]*b[0][0]+r[1][1]*b[1][0];
aux[1][1]=r[1][0]*b[0][1]+r[1][1]*b[1][1];
r[0][0]=aux[0][0]%M;r[0][1]=aux[0][1]%M;r[1][0]=aux[1][0]%M;r[1][1]=aux[1][1]%M;
}
aux[0][0]=b[0][0]*b[0][0]+b[0][1]*b[1][0];
aux[0][1]=b[0][0]*b[0][1]+b[0][1]*b[1][1];
aux[1][0]=b[1][0]*b[0][0]+b[1][1]*b[1][0];
aux[1][1]=b[1][0]*b[0][1]+b[1][1]*b[1][1];
b[0][0]=aux[0][0]%M;b[0][1]=aux[0][1]%M;b[1][0]=aux[1][0]%M;b[1][1]=aux[1][1]%M;
}
return r[0][1];
}
int main(){
freopen("calcul.in","r",stdin);
freopen("calcul.out","w",stdout);
scanf("%s\n",A);l=strlen(A);for (i=((l-9)>0)?(l-9):0;i<l;++i)a=a*10+A[i]-'0';
scanf("%s\n",A);l=strlen(A);
scanf("%d",&c);
for (i=0;i<l;++i){
nr=A[i];
if (nr>='A'&&nr<='F')nr=nr-'A'+10;else nr=nr-'0';
if (nr&8)p[i<<2]=1;
if (nr&4)p[(i<<2)+1]=1;
if (nr&2)p[(i<<2)+2]=1;
if (nr&1)p[(i<<2)+3]=1;
}
l=l<<2;
i=1;
if(c==1)printf("%lld\n",(long long)power()%10);
if(c==2)printf("%02lld\n",(long long)power()%100);
if(c==3)printf("%03lld\n",(long long)power()%1000);
if(c==4)printf("%04lld\n",(long long)power()%10000);
if(c==5)printf("%05lld\n",(long long)power()%100000);
if(c==6)printf("%06lld\n",(long long)power()%1000000);
if(c==7)printf("%07lld\n",(long long)power()%10000000);
if(c==8)printf("%08lld\n",(long long)power()%100000000);
if(c==9)printf("%09lld\n",(long long)power()%1000000000);
return 0;
}