这... 练练搜索吧... 自己写的哈希都不行.. 悲催悲催...
/********************
HDU 4277
Sevenster
2012.09.12
********************/
#include<iostream>
#include<algorithm>
#include<set>
#include<cmath>
#define HashSize (1<<15)-1;
using namespace std;
int T,N,ans,sum;
int E[16];
__int64 hash[1<<15];
set<__int64>se;
bool judge( int a,int b,int c )
{
if( a+b>c&&abs(a-b)<c )
return true;
return false;
}
void swap( int &a,int &b )
{
a^=b;b^=a;a^=b;
}
bool Hash( int a,int b,int c )
{
if( a<b ) swap(a,b);
if( b<c ) swap(b,c);
if( a<b ) swap(a,b);
__int64 ploy=a+b*sum+c*sum*sum;
if( se.find(ploy)==se.end() )
{
se.insert(ploy);
return true;
}
return false;
/**
int val=ploy%HashSize;
while( hash[val]!=-1||hash[val]!=ploy )
val=(val<<1|1)%HashSize;
if( hash[val]==-1 )
{
hash[val]=ploy;
return true;
}*/
}
void dfs( int a,int b,int c,int d )
{
if( judge(a,b,c)&&Hash(a,b,c) )
ans++;
if( d>N )
return ;
if( c-E[d]+b>a+E[d] )
dfs( a+E[d],b,c-E[d],d+1 );
if( c-E[d]+a>b+E[d] )
dfs( a,b+E[d],c-E[d],d+1 );
dfs( a,b,c,d+1 );
}
int main()
{
scanf( "%d",&T );
while( T-- )
{
ans=0;
se.clear();
memset( hash,-1,sizeof(hash) );
scanf( "%d",&N );
sum=0;
for( int i=1;i<=N;i++ )
{
scanf( "%d",&E[i] );
sum+=E[i];
}
dfs( E[1],0,sum-E[1],2 );
printf( "%d\n",ans );
}
return 0;
}