1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
#include <iostream>
#include <set>
#include <map>

bool is_potyczkowa(long long n) {
    if (n < 1) return false;
    for (long long x = n; x > 0; x /= 10) {
        long long digit = x % 10;
        if (digit == 0 || n % digit != 0) return false;
    }
    return true;
}

int set_of_digits(long long n, int omit=0) {
    int ret = 0;
    for (long long x = n; x > 0; x /= 10) {
        if (omit == 0) ret |= (1 << (x % 10));
        else --omit;
    }
    return ret;
}

#define M 2520
long long D[M][19][1024];

void calc_D() {
    for (int l = 0; l < 19; ++l) {
        for (int a = 0; a < M; ++a) {
            for (int b = 0; b < 1024; ++b) {
                D[a][l][b] = 0;
            }
        }
    }

    for (long long i = 1; i < 10; ++i) {
        D[i % M][1][set_of_digits(i)] += 1;
    }

    long long ten_to_l = 10;
    for (int l = 2; l < 19; ++l) {
        for (int a = 0; a < M; ++a) {
            for (int b = 0; b < 1024; ++b) {
                for (int d = 0; d <= 9; ++d) {
                    int new_ds = (b | (1 << d));
                    D[(a + ten_to_l * d) % M][l][new_ds] += D[a][l - 1][b];
                }
            }
        }
        ten_to_l *= 10;
    }

}

long long count(int len, long long prefix) {
    if (len == 0) return is_potyczkowa(prefix);

    long long ret = 0;
    for (int l = 0; l <= len; ++l) {
        int suffix_ds = set_of_digits(prefix, l);
        for (int a = 0; a < M; ++a) {
            for (int b = 0; b < 1024; b += 2) {
                auto new_ds = suffix_ds | b;

                int na = (a + prefix) % M;

                bool pass = 1;
                for (int d = 0; d <= 9; ++d) {
                    if (new_ds & (1 << d)) {
                        if (d == 0 || na % d != 0) {
                            pass = 0;
                            break;
                        }
                    }
                }

                if (pass) {
                    ret += D[a][l][b];
                }
            }
        }
    }

    return ret;
}

long long count_to(long long n) {
    int len = 0;
    long long ret = is_potyczkowa(n);
    long long pow_10 = 1;
    for (long long x = n; x > 0; x /= 10) {
        for (int d = 0; d < x % 10; ++d) {
            ret += count(len, (x - x % 10 + d) * pow_10);
        }
        pow_10 *= 10;
        ++len;
    }
    return ret;
}

int main() {
    std::ios::sync_with_stdio(false);
    long long a, b;
    std::cin >> a >> b;
    calc_D();
    std::cout << count_to(b) - count_to(a - 1);
    return 0;
}