/*
TASK:digits
LANG:C++
*/
#include <stdio.h>
#include <string>
#include <string.h>
#include <queue>
#include <vector>

using namespace std;

#define MAX(a,b) (((a)>(b))?(a):(b))
#define IN "digits.in"
#define OUT "digits.out"
#define MAXN 1048576

int N,K,R,M;
char str[MAXN];

typedef struct Integer {
        vector <int> ar;
        
        Integer() {ar.clear();ar.push_back(0);}
        
        Integer (int k) {
                if (k==-1) ar.clear();
                while (k>0) {
                      ar.push_back(k%10);
                      k/=10;
                }
        }
        Integer (char * str) {
                for (int i=strlen(str)-1; i>=0; i--) {
                    ar.push_back(str[i]-'0');
                }
        }

        void push_back(int k) {ar.push_back(k);}

        string get () {
               string ret;
               for (int i=(int)ar.size()-1; i>=0; i--) {
                   ret += (ar[i]+'0');
               }
               return ret;
        }


        Integer operator+(const Integer &h) {
                Integer ret(-1);
                int lim=MAX(ar.size(),h.ar.size());
                int temp=0;
                for (int i=0; i<lim; i++) {
                    if (i<ar.size()) temp+=ar[i];
                    if (i<h.ar.size()) temp+=h.ar[i];
                    ret.push_back(temp%10);
                    temp/=10;
                }
                if (temp > 0) ret.push_back(temp);
                return ret;
        }
        Integer operator+(int h) {
                Integer ret(-1);
                int temp=0;
                for (int i=0; i<ar.size(); i++) {
                    temp = h%10+ar[i];
                    ret.push_back(temp%10);
                    temp/=10;
                    h/=10;
                }
                temp += h;
                while (temp > 0) {
                      ret.push_back(temp%10);
                      temp/=10;
                }
                return ret;
        }

        Integer operator*(int h) const {
                Integer ret(-1);
                int temp=0;

                for (int i=0; i<ar.size(); i++) {
                    temp = temp+ar[i]*h;
                    ret.push_back(temp%10);
                    temp/=10;
                }
                while (temp>0) {
                      ret.push_back(temp%10);
                      temp/=10;
                }
                return ret;
        }
        Integer operator*(const Integer &h) const {
                Integer ret(-1);

                if ((h.ar.size() == 1 && h.ar[0]==0)||(ar.size()==1 && ar[0]==0)) return Integer(0);
                Integer temp;
                for (int i=0; i<ar.size(); i++) {
                    temp.ar.clear();
                    for (int j=0; j<i; j++) temp.push_back(0);
                    temp = (h*ar[i]);
                    for (int j=0; j<i; j++) temp.ar.insert(temp.ar.begin(),0);
                    ret = ret + temp;
                }
                return ret;
        }
        Integer operator-(int h) const {
                Integer ret(-1);
                int temp=-h;
                for (int i=0; i<ar.size(); i++) {
                    temp+=ar[i];
                    if (temp < 0) {
                       ret.push_back(10-temp);
                       temp=-1;
                    } else {
                      ret.push_back(temp);
                      temp=0;
                    }
                }
                return ret;
        }
};

int decode (char c) {
    if (isdigit(c)) return c-'0';
    else return c-'A'+10;
}

Integer * after;
Integer * num;
Integer ans(0);
int get (int num,int d) {
    int ret=0;
    while (num > 0) {
          if (num % 10 == d) {
             ret++;
          }
          num /= 10;
    }
    return ret;
}

int main () {
//    freopen(IN,"r",stdin);
//    freopen(OUT,"w",stdout);

    scanf("%d%d%d\n",&R,&M,&K);
    scanf("%s",str);

   if (R <= 6 && K == 10) {
       int k=0;
       int ans=0;
       
       for (int i=0; i<strlen(str); i++) {
           k=k*10+decode(str[i]);
       }
       for (int i=1; i<=k; i++) {
           ans += get(i,M);
       }
       printf("%d\n",ans);
       return 0;
    }
    
    after = new Integer[R+1];
    num = new Integer[R+1];


    Integer k1(1);
    Integer k2(0);
    for (int i=R-1; i>=0; i--) {
        after[i]=k1;
        k2 = k2+k1*decode(str[i]);
        num[i]=k2;
        k1 = k1*K;

    }
    
    Integer k;
    Integer ans;
    for (int i=0; i<R; i++) {
        if (decode(str[i]) < M) {
           ans = ans + k*after[i];
        }
        if (decode(str[i]) > M) {
           if (!((i==0 || i==R-1) && M==0))
           ans = ans + k*after[i] + after[i];
        }
        if (decode(str[i]) == M) {
           if (M==0)
              ans = ans + (k-1)*after[i] + num[i];
           else
              ans = ans + k*after[i] + num[i];
           
        }
        k = k*K+decode(str[i]);
    }

    printf("%s\n",ans.get().c_str());

    return 0;
}
