#include <algorithm> #include <bitset> #include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; using MASK_t = char; MASK_t maska_z_cyfr(string const& cyfry) { MASK_t mask = 0; for( auto&& c : cyfry) { if( c < '2' ) continue; int poz = c - '0' - 2; char bit = ( 1 << poz ); mask |= bit; } return mask; } struct Zadanie { long long const pocz; vector< MASK_t > dane; Zadanie( long long l, long long r) : pocz(l) {; dane.resize(r - l + 1ull, 0xFF); // USTAWIAMY MASKE NA 255 (blad) } int zlicz() { erastostenes(); // GASIMY BITY PODZIELNE cyfry(); // GASIMY BITY BEZ CYFR (ALBO ZAPALAMY WSZYTKO JESLI 0) return count_if(dane.begin(), dane.end(), [](char c) {return c == 0;}); } void erastostenes() { for( int i = 2; i < 10; i++ ) { erastostenes(i); } } void erastostenes(int const dzielnik) { MASK_t mask1101 = ~(1 << (dzielnik - 2)); long long reszta = pocz % dzielnik; long long poz = reszta ? pocz - reszta + dzielnik : pocz; while( poz < pocz + dane.size() ) { dane[ poz - pocz ] &= mask1101; poz += dzielnik; } } void cyfry() { for( int i = 0; i < dane.size(); ++i ) { MASK_t& d = dane[i]; long long liczba = pocz + i; string cyfry = to_string(liczba); if(find_if(cyfry.begin(), cyfry.end(), [](const char c) { return c == '0'; }) != cyfry.end()) { d = 0xFF; } else if(d != 0) { char mask = maska_z_cyfr(cyfry); d &= mask; } } } }; int main() { long long l, r; cin >> l >> r; long long wynik = 0; while( l <= r ) { long long right = min(r, l + 1'000'000ll); Zadanie z(l, right); wynik += z.zlicz(); l = right + 1; } cout << wynik << 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 89 | #include <algorithm> #include <bitset> #include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; using MASK_t = char; MASK_t maska_z_cyfr(string const& cyfry) { MASK_t mask = 0; for( auto&& c : cyfry) { if( c < '2' ) continue; int poz = c - '0' - 2; char bit = ( 1 << poz ); mask |= bit; } return mask; } struct Zadanie { long long const pocz; vector< MASK_t > dane; Zadanie( long long l, long long r) : pocz(l) {; dane.resize(r - l + 1ull, 0xFF); // USTAWIAMY MASKE NA 255 (blad) } int zlicz() { erastostenes(); // GASIMY BITY PODZIELNE cyfry(); // GASIMY BITY BEZ CYFR (ALBO ZAPALAMY WSZYTKO JESLI 0) return count_if(dane.begin(), dane.end(), [](char c) {return c == 0;}); } void erastostenes() { for( int i = 2; i < 10; i++ ) { erastostenes(i); } } void erastostenes(int const dzielnik) { MASK_t mask1101 = ~(1 << (dzielnik - 2)); long long reszta = pocz % dzielnik; long long poz = reszta ? pocz - reszta + dzielnik : pocz; while( poz < pocz + dane.size() ) { dane[ poz - pocz ] &= mask1101; poz += dzielnik; } } void cyfry() { for( int i = 0; i < dane.size(); ++i ) { MASK_t& d = dane[i]; long long liczba = pocz + i; string cyfry = to_string(liczba); if(find_if(cyfry.begin(), cyfry.end(), [](const char c) { return c == '0'; }) != cyfry.end()) { d = 0xFF; } else if(d != 0) { char mask = maska_z_cyfr(cyfry); d &= mask; } } } }; int main() { long long l, r; cin >> l >> r; long long wynik = 0; while( l <= r ) { long long right = min(r, l + 1'000'000ll); Zadanie z(l, right); wynik += z.zlicz(); l = right + 1; } cout << wynik << endl; return 0; } |