#include <iostream>
#include <math.h>
#include <vector>
void inc_inst(int* inst, int amount) {
int n = amount;
for(int i = 0; n != 0; i++) {
inst[i] += n % 10;
n /= 10;
if(inst[i] > 9) {
inst[i] %= 10;
n += 1;
}
}
}
int step(std::vector<int>& inst, int inst_size, int* digits) {
int n = 0;
int carry = 1;
int dec_mult = 1;
int i = 0;
for(; i < inst_size && carry == 1; i++) {
int old_d = inst[i];
digits[inst[i] - 1] --; // dec the old digit
// Increment the inst
inst[i] += carry;
carry = inst[i] / 10;
inst[i] = inst[i] % 10;
if (inst[i] == 0) {
inst[i] = 1;
}
digits[inst[i] - 1] ++; // inc the new digit
n += dec_mult * (inst[i] - old_d);
dec_mult *= 10;
}
return n;
}
void formalize(std::vector<int>& inst, int inst_len, int* digits, int n_) {
int n = n_;
for(int i = 0; i < inst_len; i++) {
int d = n % 10;
inst[i] = d;
if (d != 0) digits[d-1] += 1;
n /= 10;
}
}
int main() {
int l, r;
std::cin >> l >> r;
int digits[9] = {0};
int count = 0;
int n_len = (double)(std::log10(r)) + 1;
std::vector<int> num(n_len, 0);
formalize(num, n_len, digits, l);
while( l < r + 1 ) {
bool all_divide = true;
for(int i = 0; i < 9 && all_divide; i++) {
if(digits[i] == 0) continue;
all_divide = ( l % (i+1) == 0 );
}
if(all_divide) count ++;
l += step(num, n_len, digits);
}
std::cout << count;
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 | #include <iostream> #include <math.h> #include <vector> void inc_inst(int* inst, int amount) { int n = amount; for(int i = 0; n != 0; i++) { inst[i] += n % 10; n /= 10; if(inst[i] > 9) { inst[i] %= 10; n += 1; } } } int step(std::vector<int>& inst, int inst_size, int* digits) { int n = 0; int carry = 1; int dec_mult = 1; int i = 0; for(; i < inst_size && carry == 1; i++) { int old_d = inst[i]; digits[inst[i] - 1] --; // dec the old digit // Increment the inst inst[i] += carry; carry = inst[i] / 10; inst[i] = inst[i] % 10; if (inst[i] == 0) { inst[i] = 1; } digits[inst[i] - 1] ++; // inc the new digit n += dec_mult * (inst[i] - old_d); dec_mult *= 10; } return n; } void formalize(std::vector<int>& inst, int inst_len, int* digits, int n_) { int n = n_; for(int i = 0; i < inst_len; i++) { int d = n % 10; inst[i] = d; if (d != 0) digits[d-1] += 1; n /= 10; } } int main() { int l, r; std::cin >> l >> r; int digits[9] = {0}; int count = 0; int n_len = (double)(std::log10(r)) + 1; std::vector<int> num(n_len, 0); formalize(num, n_len, digits, l); while( l < r + 1 ) { bool all_divide = true; for(int i = 0; i < 9 && all_divide; i++) { if(digits[i] == 0) continue; all_divide = ( l % (i+1) == 0 ); } if(all_divide) count ++; l += step(num, n_len, digits); } std::cout << count; return 0; } |
English