#include <iostream>
#include <set>
bool isPotyczkowa(long long liczba) {
long long tmp = liczba;
bool isPotyczkowa = liczba > 0;
while (isPotyczkowa && tmp > 0) {
long long int digit = tmp % 10;
tmp = (long long) (tmp / 10);
isPotyczkowa = digit != 0 && liczba % digit == 0;
}
return isPotyczkowa;
}
static const long long POW[18] = {1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000,
100000000000,
1000000000000,
10000000000000,
100000000000000,
1000000000000000,
10000000000000000,
100000000000000000
};
bool isAllowed(int digit, long long number) {
if (number == 0) {
return true;
}
if (digit % 2 == 0 && 0 != number % 2) {
return false;
}
if (digit %4 == 0 && number > 100 && number%4 != 0) {
return false;
}
if (digit %8 == 0 && number > 1000 && number%8 != 0) {
return false;
}
if (digit == 5 && (number % 2 == 0 || (number > 5 && number % 10 != 5))) {
return false;
}
return true;
}
void countPotyczkow(long long &steps, long long min, long long max, long long &count, long long number, int pos) {
steps++;
if (number <= max) {
if (number >= min and isPotyczkowa(number)) {
count++;
}
for (int i = 1; i <= 9; i++) {
long long int next = POW[pos] * i + number;
if (next <= max && isAllowed(i, number)) {
countPotyczkow(steps, min, max, count, next, pos + 1);
}
}
}
}
int main() {
long long l = 0;
long long r = r;
long long count = 0;
long long steps = 0;
std::cin >> l >> r;
if(r-l <= POW[6]){
while(l <=r) {
if(isPotyczkowa(l++)) {
count++;
}
}
} else {
countPotyczkow(steps, l, r, count, 0, 0);
}
std::cout << count << std::endl;
return 0;
}
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 | #include <iostream> #include <set> bool isPotyczkowa(long long liczba) { long long tmp = liczba; bool isPotyczkowa = liczba > 0; while (isPotyczkowa && tmp > 0) { long long int digit = tmp % 10; tmp = (long long) (tmp / 10); isPotyczkowa = digit != 0 && liczba % digit == 0; } return isPotyczkowa; } static const long long POW[18] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000 }; bool isAllowed(int digit, long long number) { if (number == 0) { return true; } if (digit % 2 == 0 && 0 != number % 2) { return false; } if (digit %4 == 0 && number > 100 && number%4 != 0) { return false; } if (digit %8 == 0 && number > 1000 && number%8 != 0) { return false; } if (digit == 5 && (number % 2 == 0 || (number > 5 && number % 10 != 5))) { return false; } return true; } void countPotyczkow(long long &steps, long long min, long long max, long long &count, long long number, int pos) { steps++; if (number <= max) { if (number >= min and isPotyczkowa(number)) { count++; } for (int i = 1; i <= 9; i++) { long long int next = POW[pos] * i + number; if (next <= max && isAllowed(i, number)) { countPotyczkow(steps, min, max, count, next, pos + 1); } } } } int main() { long long l = 0; long long r = r; long long count = 0; long long steps = 0; std::cin >> l >> r; if(r-l <= POW[6]){ while(l <=r) { if(isPotyczkowa(l++)) { count++; } } } else { countPotyczkow(steps, l, r, count, 0, 0); } std::cout << count << std::endl; return 0; } |
English