#include <bits/stdc++.h>
using namespace std;

#define REP(i,n) for(int i = 0; i < (n); ++i)
#define FOR(i,a,b) for(int i = (a); i <= (b); ++i)
#define FORD(i,a,b) for(int i = (a); i >= (b); --i)

#define maxN 10005

#define pii pair<int,int>
#define X first
#define Y second

#define MOD 12345647

int n, l;
char N[maxN], L[maxN];
map<pair<int, pair<pii, pii>>, int> dp;

int compute(int pos, int carry, bool b0, bool b1, bool b2) {
  if (pos == n) {
    if (carry == 0) return 1;
    return 0;
  }
  int d0 = b0 ? (L[pos] - '0') : 0;
  int d1 = b1 ? (L[pos] - '0') : 0;
  int d2 = b2 ? (L[pos] - '0') : 0;
  pair<int, pair<pii, pii>> state = {pos, {{carry, b0}, {b1, b2}}};
  if (dp.count(state)) return dp[state];

  int ans = 0;
  int goal = carry * 10 + N[pos] - '0';
  REP(new_carry, 3) {
    if (new_carry > goal) break;
    FOR(i, d0, 9) {
      if (i == 3) continue;
      if (i + 9 + 9 + new_carry < goal) continue;
      if (i + d1 + d2 + new_carry > goal) break;
      FOR(j, d1, 9) {
        if (j == 3) continue;
        int k = goal - i - j - new_carry;
        if (k == 3) continue;
        if (k < d2) break;
        if (k > 9) continue;
        ans += compute(pos + 1, new_carry, (b0 && i == d0), (b1 && j == d1), (b2 && k == d2));
        ans %= MOD;
//        printf("use %d %d %d\n", i, j, k);
//        printf("new ans after (%d, %d, %d, %d,%d): %d\n", pos + 1, new_carry, (b0 && i == d0), (b1 && j == d1), (b2 && k == d2), ans);
      }
    }
  }

  ans %= MOD;
  dp[state] = ans;
//  printf("ds %d %d %d\n", d0, d1, d2);
//  printf("%d %d %d %d %d: %d\n", pos, carry, b0, b1, b2, ans);
  return ans;
}

int main() {
  while (scanf("%s%s", N, L) == 2) {
    dp.clear();
    n = strlen(N);
    if (n == 1 && N[0] == '0') break;
    l = strlen(L);
    FORD(i, n-1, n - l) {
      L[i] = L[i - n + l];
    }
    L[n] = 0;
    REP(i, n-l) L[i] = '0';
//    printf("%s(%d) %s(%d)\n", N, n, L, l);
    int ans = compute(0, 0, true, true, true);
    printf("%d\n", ans);
  }
  return 0;
}