Advertisement
pb_jiang

T3 Hash

Aug 31st, 2024
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. using ll = long long;
  2. constexpr ll hm = (1ll << 52) - 51;
  3.  
  4. ll f(ll x) {
  5.     static const ll c1 = random(), c2 = random(), c3 = random(), c4 = random();
  6.     return x * x * x * c1 + x * x + c2 + x * c3 + c4;
  7. }
  8.  
  9. class Solution {
  10.     vector<int> pmod;
  11.     // using a2i = array<int, 2>;
  12.     set<ll> valid;
  13.     map<ll, ll> cnt;
  14.    
  15.     ll ans;
  16.     void search(int beg, int end, int mod, int k, ll hash) {
  17.         if (beg > end) {
  18.             if (mod == 0) {
  19.                 if (valid.count(hash))
  20.                     ans += 1;
  21.                 else {
  22.                     ans += cnt[hash] + 1;
  23.                     valid.insert(hash);
  24.                 }
  25.             } else {
  26.                 if (valid.count(hash))
  27.                     ans += 1;
  28.             }
  29.             cnt[hash] += 1;
  30.             return;
  31.         };
  32.         for (int i = 0; i <= 9; ++i) {
  33.             if (beg == 0 && i == 0) continue;
  34.             if (beg != end)
  35.                 search(beg + 1, end - 1, (mod + i * (pmod[beg] + pmod[end])) % k, k, (hash + f(i) + f(i)) % hm);
  36.             else
  37.                 search(beg + 1, end - 1, (mod + i * (pmod[beg])) % k, k, (hash + f(i)) % hm);
  38.         }
  39.     }
  40. public:
  41.     long long countGoodIntegers(int n, int k) {
  42.         ans = 0;
  43.         pmod = vector<int>(n + 1);
  44.         pmod[0] = 1;
  45.         for (int i = 1; i < n; ++i)
  46.             pmod[i] = pmod[i - 1] * 10 % k;
  47.        
  48.         search(0, n - 1, 0, k, 0);
  49.        
  50.         return ans;
  51.     }
  52. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement