这... 练练搜索吧... 自己写的哈希都不行.. 悲催悲催...
/******************** 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; }