Advertisement
tien_noob

XOR Hashing

Jun 22nd, 2021
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. const long long N = 1e6, mod = 999999999989;
  6. int c[N + 1], a[41], n;
  7. bool b[N + 1];
  8. vector<long long> Cnt1, Cnt2;
  9. void Sieve()
  10. {
  11.     fill(b + 1, b + N + 1, true);
  12.     for (int i = 2; i * i <= N; ++ i)
  13.     {
  14.         if (b[i])
  15.         {
  16.             for (int j = i * i; j <= N; j += i)
  17.             {
  18.                 if (b[j])
  19.                 {
  20.                     b[j] = false;
  21.                     c[j] = i;
  22.                 }
  23.             }
  24.         }
  25.     }
  26.     for (int i = 2; i <= N; ++ i)
  27.     {
  28.         if (b[i])
  29.         {
  30.             c[i] = i;
  31.         }
  32.     }
  33. }
  34. void Gen(int i, int lim, vector<long long>& Cnt, long long Carry)
  35. {
  36.     if (i == lim + 1)
  37.     {
  38.         Cnt.push_back(Carry);
  39.         return ;
  40.     }
  41.     Gen(i + 1, lim, Cnt, Carry);
  42.     long long bruh = __gcd(Carry, (long long)a[i]);
  43.     Carry /= bruh;
  44.     Carry *= a[i]/bruh;
  45.     Carry %= mod;
  46.     Gen(i + 1, lim, Cnt, Carry);
  47. }
  48. void read()
  49. {
  50.    cin >> n;
  51.    for (int i = 1; i <= n; ++ i)
  52.    {
  53.        cin >> a[i];
  54.        int res = 1;
  55.        while (a[i] > 1)
  56.        {
  57.            int tmp = c[a[i]];
  58.            int cnt = 0;
  59.            while (a[i] % tmp == 0)
  60.            {
  61.                cnt = (cnt + 1) % 2;
  62.                a[i] /= tmp;
  63.            }
  64.            res *= ((cnt == 0) ? 1 : tmp);
  65.        }
  66.        a[i] = res;
  67.    }
  68.    Gen(1, n/2, Cnt1, 1);
  69.    Gen(n/2 + 1, n, Cnt2, 1);
  70. }
  71. void solve()
  72. {
  73.    long long res = 0;
  74.    sort(Cnt2.begin(), Cnt2.end());
  75.    for (long long i : Cnt1)
  76.    {
  77.        res += (long long)(upper_bound(Cnt2.begin(), Cnt2.end(), i) - lower_bound(Cnt2.begin(), Cnt2.end(), i));
  78.    }
  79.    cout << res - 1;
  80. }
  81. int main()
  82. {
  83.     ios_base::sync_with_stdio(false);
  84.     cin.tie(nullptr);
  85.     //freopen(TASK".INP", "r", stdin);
  86.     //freopen(TASK".OUT", "w", stdout);
  87.     Sieve();
  88.     int t = 1;
  89.     bool typetest = false;
  90.     if (typetest)
  91.     {
  92.         cin >> t;
  93.     }
  94.     for (int __ = 1; __ <= t; ++ __)
  95.     {
  96.         cerr << "Case " << __ << ": ";
  97.         read();
  98.         solve();
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement