Saturday, January 26, 2019

[HeackerEarth] SPECIAL PAIRS

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : SPECIAL PAIRS 
Source            : HeackerEarth
Category          : Linear Algebra
Algorithm         : Fast Walsh-Hadamard transform 
Verdict           : Accepted

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. typedef long long ll;  
  6.   
  7. static const int maxn = 1e5 + 5;  
  8. static const int N    = 1 << 20;  
  9.   
  10. template <typename T> struct FWT  
  11. {  
  12.       void fwt(T io[], int n)  
  13.       {  
  14.             for (int d = 1; d < n; d <<= 1)  
  15.             {  
  16.                   for (int i = 0, m = d<<1; i < n; i += m)  
  17.                   {  
  18.                         for (int j = 0; j < d; j++)  
  19.                         {  
  20.                               T x = io[i+j], y = io[i+j+d];  
  21.                               io[i+j] = x+y;  
  22.                         }  
  23.                   }  
  24.             }  
  25.       }  
  26.       void ufwt(T io[], int n)  
  27.       {  
  28.             for (int d = 1; d < n; d <<= 1)  
  29.             {  
  30.                   for (int i = 0, m = d<<1; i < n; i += m)  
  31.                   {  
  32.                         for (int j = 0; j < d; j++)  
  33.                         {  
  34.                               T x = io[i+j], y = io[i+j+d];  
  35.                               io[i+j] = x-y;  
  36.                         }  
  37.                   }  
  38.             }  
  39.       }  
  40.       void self_convolution(T a[], int n)  
  41.       {  
  42.             fwt(a, n);  
  43.             for (int i = 0; i < n; i++) a[i] = a[i] * a[i];  
  44.             ufwt(a, n);  
  45.       }  
  46. };  
  47.   
  48. FWT <ll> fwt;  
  49. ll ret[N+5], cnt[maxn];  
  50. ll arr[maxn];  
  51.   
  52. int main()  
  53. {  
  54.       //freopen("in.txt", "r", stdin);  
  55.       int tc;  
  56.       cin >> tc;  
  57.       for (int tcase = 1; tcase <= tc; tcase++)  
  58.       {  
  59.             int n;  
  60.             cin >> n;  
  61.             for (int i = 0; i < n; i++)  
  62.             {  
  63.                   int x;  
  64.                   cin >> x;  
  65.                   ret[x]++;  
  66.                   cnt[x]++;  
  67.             }  
  68.             fwt.self_convolution(ret, N);  
  69.             ll ans = ret[0];  
  70.             cout << ans << endl;  
  71.             fill(begin(ret), end(ret), 0);  
  72.             fill(begin(cnt), end(cnt), 0);  
  73.       }  
  74. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.