Cod sursa(job #274368)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 9 martie 2009 17:40:03
Problema Calcul Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#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;
}