Advertisement
Guest User

fibuceta

a guest
Mar 22nd, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 1 << 17
  3. #define LOGN 17
  4. #define MOD 1000000007
  5.  
  6. using namespace std;
  7. typedef long long ll;
  8.  
  9. vector<ll> ORANDO(vector<ll> &a) {
  10.     vector<ll> ans(MAX, 0);
  11.     for (int i = 0; i < MAX; i++){
  12.         for (int j = i-1; j >= 0; j = (j-1)&i){
  13.             ll mult = (a[i^j]*a[j])%MOD;
  14.             ans[i] = (ans[i] + mult)%MOD;
  15.             if(j == 0) break;
  16.         }
  17.     }
  18.  
  19.     return ans;
  20. }
  21.  
  22. int T[3][2][2][2] = {
  23.     { { {1,  1}, {1, -1} }, { {1,  1}, {1, -1} } }, /// xor
  24.     { { {0,  1}, {1,  1} }, { {-1, 1}, {1,  0} } }, /// and
  25.     { { {1,  1}, {1,  0} }, { {0,  1}, {1, -1} } }  /// or
  26. };
  27.  
  28. void FFT(vector<ll> &a, int op, bool inverse = false) {
  29.     ll u1 = T[op][inverse][0][0], v1 = T[op][inverse][0][1];
  30.     ll u2 = T[op][inverse][1][0], v2 = T[op][inverse][1][1];
  31.  
  32.     for(int b = 0; b < LOGN; b++)
  33.         for(int i = 0; i < MAX; i++)
  34.             if((i & (1 << b)) == 0) {
  35.                 ll u = a[i], v   = a[i + (1 << b)];
  36.                 a[i]            = ((u*u1)%MOD + (v*v1)%MOD)%MOD;
  37.                 a[i + (1 << b)] = ((u*u2)%MOD + (v*v2)%MOD)%MOD;
  38.             }
  39.  
  40.     if (op == 0 && inverse)
  41.         for (int i=0; i<a.size(); i++)
  42.             a[i] >>= LOGN;
  43. }
  44.  
  45. /// op is 0 for XOR, 1 for AND, 2 for OR
  46. vector<ll> convolution(vector<ll> a, vector<ll> b, int op) {
  47.     FFT(a, op, false);
  48.     FFT(b, op, false);
  49.     for(int i=0; i<a.size(); i++)
  50.         a[i] = (a[i] * b[i])%MOD;
  51.     FFT(a, op, true);
  52.     return a;
  53. }
  54.  
  55. ll fibo[MAX];
  56. void build(){
  57.     fibo[1] = 1LL;
  58.     for(ll i = 2LL; i < MAX; i++) fibo[i] = (fibo[i-1]+fibo[i-2])%MOD;
  59. }
  60.  
  61. void print(vector<ll> &a, int sz){
  62.     for(int i = 0; i < sz; i++) cout << a[i] << " ";
  63.     cout << endl;
  64. }
  65. int main(){
  66.     int n; scanf("%d", &n);
  67.     vector<ll> arr(MAX, 0);
  68.     for(int i = 0; i < n; i++){
  69.         ll x;scanf("%lld", &x);
  70.         arr[x]++;
  71.     }
  72.  
  73.     build();
  74.     vector<ll> oris = ORANDO(arr);
  75.     vector<ll> xoris = convolution(arr, arr, 0); // RIP XORIS
  76.    
  77.     for(int i = 0; i < oris.size(); i++) oris[i] = (fibo[i]*oris[i])%MOD;
  78.     for(int i = 0; i < xoris.size(); i++) xoris[i] = (xoris[i]*fibo[i])%MOD;
  79.     for(int i = 0; i < arr.size(); i++) arr[i] = (fibo[i]*arr[i])%MOD;
  80.  
  81.     vector<ll> andis = convolution(oris, arr, 1);
  82.     vector<ll> ans = convolution(andis, xoris, 1);
  83.  
  84.     //print(ans, 50);
  85.     ll resp = 0LL;
  86.     for(ll i = 1LL; i <= (1 << 17); i *= 2LL) {
  87.         if(ans[i] != 0) resp = (resp+ans[i])%MOD;
  88.     }
  89.     printf("%lld\n", resp);
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement