Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1.  
  2. #define ll long long
  3. #define pii pair <int,int>
  4. #define mp make_pair
  5. #define pb push_back
  6.  
  7. #include <vector>
  8. #include <list>
  9. #include <map>
  10. #include <set>
  11. #include <deque>
  12. #include <stack>
  13. #include <bitset>
  14. #include <algorithm>
  15. #include <functional>
  16. #include <numeric>
  17. #include <utility>
  18. #include <sstream>
  19. #include <iostream>
  20. #include <iomanip>
  21. #include <cstdio>
  22. #include <cmath>
  23. #include <cstdlib>
  24. #include <ctime>
  25. #include <cstring>
  26. #include <queue>
  27. #include <cassert>
  28.  
  29.  
  30. using namespace std;
  31.  
  32. const ll INF = (1LL<<31);
  33. const int N = 10;
  34.  
  35. int a[N],p[N];
  36. int n,m;
  37. map<int,int>hash;
  38. map<int,int>::iterator it;
  39. vector< pii >u,v;
  40. ll ans;
  41. ll TINF;
  42.  
  43. struct HT
  44. {
  45.  
  46.     int *T,*C,m;
  47.     HT(int m=3375007)
  48.     {
  49.         this->m=m;
  50.         T=new int[m];
  51.         C=new int[m];
  52.     }
  53.  
  54.     void clear()
  55.     {
  56.         memset(T,-1,m*sizeof(int));
  57.     }
  58.  
  59.  
  60.     int h( int k,int i )
  61.     {
  62.         //h1+i*h2
  63.         return (m + ( (k%m) + (ll)i*( 1+(k% (m-1) ) ) ) )%m;
  64.     }
  65.  
  66.     void insert(int k )
  67.     {
  68.         int i=0,j;
  69.         while( i!=m )
  70.         {
  71.             j=h( k,i );
  72.             if( T[j]==-1 ){T[j]=k,C[j]=1;return;}
  73.             else if( T[j]==k ){C[j]++;return;}
  74.             else i=i+1;
  75.         }
  76.     }
  77.     int search( int k )
  78.     {
  79.         int i=0,j;
  80.         while( i!=m  )
  81.         {
  82.             j=h( k,i );
  83.             if( T[j]==-1 )return 0;
  84.             else if( T[j]==k )return C[j];
  85.             else i=i+1;
  86.         }
  87.         return 0;
  88.     }
  89.     ~HT()
  90.     {
  91.         delete T;
  92.     }
  93. };
  94.  
  95. HT H;
  96. ll myabs( ll a )
  97. {
  98.     if(a<0)a=-a;
  99.     return a;
  100. }
  101. ll dp[155][32];
  102. ll pow( int x,int n )
  103. {
  104.     if(x==1)return 1;
  105.     if( dp[x][n]!=-1 )return dp[x][n];
  106.     ll ret=1;
  107.     for(int i=0;i<n;i++)ret*=x;
  108.     return dp[x][n]=ret;
  109. }
  110. void f1( int p,ll s )
  111. {
  112.  
  113.  
  114.  
  115.     if( p==v.size() )
  116.     {
  117.  
  118.         H.insert( (int)s );
  119.        // cout<<endl;
  120.        // hash[ (int)s ]++;
  121.         return;
  122.     }
  123.  
  124.  
  125.     ll ns;
  126.  
  127.  
  128.  
  129.     for( int i=1;i<=m;i++ )
  130.     {
  131.         ns=s+ v[ p ].first * (ll)pow( i, v[p].second );
  132.         if( myabs(ns)>=INF )break;
  133.         f1( p+1,ns );
  134.     }
  135.  
  136.  
  137.     return;
  138.  
  139. }
  140.  
  141.  
  142. void f2( int p,ll s )
  143. {
  144.     if( p==u.size() )
  145.     {
  146.         ans+=H.search( (int)s );
  147.        // it=hash.find( (int)s );
  148.        // if( it!=hash.end() )ans+=it->second;
  149.         return;
  150.     }
  151.  
  152.  
  153.     ll ns;
  154.     for( int i=1;i<=m;i++ )
  155.     {
  156.         ns=s+ u[ p ].first * (ll)pow( i, u[p].second );
  157.         if( myabs(ns)>=INF )break;
  158.         f2( p+1,ns );
  159.     }
  160.  
  161.  
  162.     return;
  163.  
  164. }
  165.  
  166.  
  167.  
  168.  
  169. int main()
  170. {
  171.  
  172.  
  173.     //freopen("in.txt","r",stdin);
  174.  
  175.     int T,i,j,k,x,y;
  176.     cin>>T;
  177.  
  178.     memset( dp,-1,sizeof(dp) );
  179.  
  180.     while(T--)
  181.     {
  182.         cin>>n>>m;
  183.  
  184.  
  185.         for( i=0,j=0;i<n;i++ )
  186.         {
  187.             cin>>a[i]>>p[i];
  188.         }
  189.  
  190.         u.clear();
  191.         v.clear();
  192.  
  193.         for( i=0;i<n/2;i++ )
  194.         {
  195.             v.pb( mp( -a[i],p[i] ) );
  196.         }
  197.         for(;i<n;i++)
  198.         {
  199.             u.pb( mp( a[i],p[i] ) );
  200.         }
  201.  
  202.         //hash.clear();
  203.         H.clear();
  204.  
  205.         ans=0;
  206.  
  207.         f1(0,0);
  208.         f2(0,0);
  209.  
  210.  
  211.  
  212.  
  213.         cout<<ans<<endl;
  214.  
  215.  
  216.  
  217.  
  218.     }
  219.  
  220.     return 0;
  221. }
  222.  
  223.  
  224. /*
  225. 123
  226. 6 150
  227. 1 1
  228. 1 1
  229. 1 1
  230. -1 1
  231. -1 1
  232. -1 1
  233. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement