#include <cstdio> #include <cstdlib> #include <cstdint> #include <queue> #include <utility> #define debug(...) fprintf(stderr, __VA_ARGS__) uint64_t get_int(){ char d; static uint64_t tmp; tmp = 0; while((d=getchar())>='0'){ tmp = (tmp<<3)+(tmp<<1)+d-'0'; } return tmp; } typedef std::pair<uint64_t, uint64_t> pair; inline bool czyLiczba(uint64_t x, uint64_t flag){ if(flag & (1<<6)){ if(x%6 != 0){ return false; } flag &= ~5; } if(flag & (1<<8)){ if((x & 7) != 0){ return false; } flag &= ~6; } if(flag & (1<<4)){ if((x & 3) != 0){ return false; } flag &= ~2; } if(flag & (1<<2)){ if((x & 1) != 0){ return false; } } if(flag & (1<<9)){ if(x%9 != 0){ return false; } flag &= ~3; } if(flag & (1<<3)){ if(x%3 != 0){ return false; } } if(flag & (1<<5)){ if(x%5 != 0){ return false; } } if(flag & (1<<7)){ if(x%7 != 0){ return false; } } return true; } int main(){ uint64_t l = get_int(); uint64_t r = get_int(); // debug("L: %d R: %d\n", l, r); std::queue<pair> q; for(uint64_t i=1;i<10;i++){ q.emplace(i, 1<<i); } uint64_t counter = 0, flag, tmp; for(uint64_t i=l;i<=r;i++){ flag = 0; tmp = i; // debug("4 %d\n", i); while(tmp > 0){ auto d = div(tmp, 10); if(d.rem != 0) flag |= (1<<(d.rem)); else{ flag = 0; break; } tmp = d.quot; } if(flag == 0){ continue; } // debug("5 %d\n", i); if(czyLiczba(i, flag)) { // debug("Liczba potyczkowa\n"); counter++; } } printf("%llu", counter); }
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 | #include <cstdio> #include <cstdlib> #include <cstdint> #include <queue> #include <utility> #define debug(...) fprintf(stderr, __VA_ARGS__) uint64_t get_int(){ char d; static uint64_t tmp; tmp = 0; while((d=getchar())>='0'){ tmp = (tmp<<3)+(tmp<<1)+d-'0'; } return tmp; } typedef std::pair<uint64_t, uint64_t> pair; inline bool czyLiczba(uint64_t x, uint64_t flag){ if(flag & (1<<6)){ if(x%6 != 0){ return false; } flag &= ~5; } if(flag & (1<<8)){ if((x & 7) != 0){ return false; } flag &= ~6; } if(flag & (1<<4)){ if((x & 3) != 0){ return false; } flag &= ~2; } if(flag & (1<<2)){ if((x & 1) != 0){ return false; } } if(flag & (1<<9)){ if(x%9 != 0){ return false; } flag &= ~3; } if(flag & (1<<3)){ if(x%3 != 0){ return false; } } if(flag & (1<<5)){ if(x%5 != 0){ return false; } } if(flag & (1<<7)){ if(x%7 != 0){ return false; } } return true; } int main(){ uint64_t l = get_int(); uint64_t r = get_int(); // debug("L: %d R: %d\n", l, r); std::queue<pair> q; for(uint64_t i=1;i<10;i++){ q.emplace(i, 1<<i); } uint64_t counter = 0, flag, tmp; for(uint64_t i=l;i<=r;i++){ flag = 0; tmp = i; // debug("4 %d\n", i); while(tmp > 0){ auto d = div(tmp, 10); if(d.rem != 0) flag |= (1<<(d.rem)); else{ flag = 0; break; } tmp = d.quot; } if(flag == 0){ continue; } // debug("5 %d\n", i); if(czyLiczba(i, flag)) { // debug("Liczba potyczkowa\n"); counter++; } } printf("%llu", counter); } |