Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ID: hepic
- PROG: sabotage
- LANG: C++11
- */
- #include <bits/stdc++.h>
- #define FOR(i, a, b) for(auto i=a; i<=b; ++i)
- #define REP(i, a, b) for(auto i=a; i<b; ++i)
- #define FORI(i, a, b) for(auto i=a; i!=b+1-2*(a>b); i+=1-2*(a>b))
- #define REPI(i, a, b) for(auto i=a-(a>b); i!=b-(a>b); i+=1-2*(a>b))
- #define ALL(v) v.begin(),v.end()
- #define mp(a, b) make_pair(a, b)
- #define pb(a) push_back(a)
- #define pf(a) push_front(a)
- #define eb(a, b) emplace_back(a, b)
- #define fir first
- #define sec second
- #define what_is(x) cout<<#x<<" is "<<x<<endl;
- #define type(x) typeid(x).name()
- #define ms(arr, val) memset(arr, val, sizeof(arr))
- #define min3(a,b,c) min(min(a,b),c)
- #define max3(a,b,c) max(max(a,b),c)
- #define SIZE 100010
- #define MAXN 1000000007LL
- #define NUM 1048576
- #define PI acos(-1)
- #define open_read1 freopen("a", "r", stdin)
- #define open_write1 freopen("b", "w", stdout)
- #define open_read freopen("poker.in", "r", stdin)
- #define open_write freopen("poker.out", "w", stdout)
- using namespace std;
- typedef long long LL;
- typedef long double LD;
- typedef unsigned long long ULL;
- typedef pair<double, double> PDD;
- typedef pair<int, int> PII;
- typedef pair<int, PII> PIPII;
- typedef pair<PII, PII> PPIIPII;
- typedef pair<LL, LL> PLL;
- typedef pair<ULL, ULL> PUU;
- typedef pair<LL, PLL> PLPLL;
- typedef pair<PLL, PLL> PPLLPLL;
- template<typename T, typename T1>
- ostream& operator << (ostream &out, pair<T, T1> obj)
- {
- out<<"("<<obj.first<<","<<obj.second<<")";
- return out;
- }
- template<typename T, typename T1>
- ostream& operator << (ostream &out, map<T, T1> cont)
- {
- typename map<T, T1>::const_iterator itr = cont.begin();
- typename map<T, T1>::const_iterator ends = cont.end();
- for(; itr!=ends; ++itr)
- out<<*itr<<" ";
- out<<endl;
- return out;
- }
- template<typename T>
- ostream& operator << (ostream &out, set<T> cont)
- {
- typename set<T>::const_iterator itr = cont.begin();
- typename set<T>::const_iterator ends = cont.end();
- for(; itr!=ends; ++itr)
- out<<*itr<<" ";
- out<<endl;
- return out;
- }
- template<typename T>
- ostream& operator << (ostream &out, multiset<T> cont)
- {
- typename multiset<T>::const_iterator itr = cont.begin();
- typename multiset<T>::const_iterator ends = cont.end();
- for(; itr!=ends; ++itr)
- out<<*itr<<" ";
- out<<endl;
- return out;
- }
- template<typename T, template<typename ELEM, typename ALLOC=allocator<ELEM>> class CONT>
- ostream& operator << (ostream &out, CONT<T> cont)
- {
- typename CONT<T>::const_iterator itr = cont.begin();
- typename CONT<T>::const_iterator ends = cont.end();
- for(; itr!=ends; ++itr)
- out<<*itr<<" ";
- out<<endl;
- return out;
- }
- template<typename T, unsigned int N, typename CTy, typename CTr>
- typename enable_if<!is_same<T, char>::value, basic_ostream<CTy, CTr> &>::type
- operator << (basic_ostream<CTy, CTr> &out, const T (&arr)[N])
- {
- REP(i, 0, N)
- out<<arr[i]<<" ";
- out<<endl;
- return out;
- }
- template<typename T>
- T gcd(T a, T b)
- {
- T min_v = min(a, b);
- T max_v = max(a, b);
- while(min_v)
- {
- T temp = max_v % min_v;
- max_v = min_v;
- min_v = temp;
- }
- return max_v;
- }
- template<typename T>
- T lcm(T a, T b)
- {
- return (a*b) / gcd(a, b);
- }
- template<typename T>
- T fast_exp_pow(T base, T exp, T mod)
- {
- LL res = 1;
- while(exp)
- {
- if(exp&1)
- {
- res *= base;
- res %= mod;
- }
- exp >>= 1;
- base *= base;
- base %= mod;
- }
- return res;
- }
- /*#################################################################################################################
- #################################################################################################################
- #################################################################################################################
- #################################################################################################################*/
- int T, N;
- int exist[NUM];
- LL answer;
- LL numbers[SIZE], dp_solve[NUM+10][22];
- int main()
- {
- open_read1;
- scanf("%d", &T);
- while(T--)
- {
- scanf("%d", &N);
- ms(exist, 0);
- answer = 0;
- REP(i, 0, N)
- {
- scanf("%lld", numbers+i);
- ++exist[numbers[i]];
- }
- REP(i, 0, NUM)
- dp_solve[i][0] = exist[i];
- FOR(i, 1, 20)
- {
- FOR(mask, 0, NUM)
- {
- if(mask&(1<<(i-1)))
- dp_solve[mask][i] = dp_solve[mask^(1<<(i-1))][i-1];
- else
- {
- dp_solve[mask][i] = dp_solve[mask][i-1];
- if((mask^(1<<(i-1))) <= NUM)
- dp_solve[mask][i] += dp_solve[mask^(1<<(i-1))][i-1];
- }
- }
- }
- REP(i, 0, N)
- answer += dp_solve[numbers[i]][20];
- if(exist[0])
- --answer;
- printf("%lld\n", answer);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement