1 class Solution
2 {
3 private:
4 int hashList[102];
5 public:
6 long long int get(long long int n,long long int m)
7 {
8 if(m==1)
9 return n;
10 else if(m==2)
11 return (n*(n-1))/2;
12 else if(m==3)
13 return (n*(n-1)*(n-2))/6;
14 }
15 int threeSumMulti(vector<int>& A, int target)
16 {
17 memset(hashList,0,sizeof(hashList));
18
19 for(auto d:A)
20 hashList[d] ++;
21
22 long long int result = 0;
23 for(int i = 0; i <= target&&i<=100; i ++)
24 {
25 if(hashList[i]>=3 && 3*i==target)
26 {
27 result += get(hashList[i],3);
28 result %= 1000000007;
29 }
30 if(2*i<target && hashList[i]>=2)
31 {
32 if(target-2*i > i && target-2*i <= 100 && hashList[target-2*i])
33 {
34 result += hashList[target-2*i]*get(hashList[i],2);
35 result %= 1000000007;
36 // cout << i << " " << i << " " << target-2*i << endl;
37 }
38 }
39 if(hashList[i])
40 {
41 for(int j = i+1; j <= target && j<=100; j ++)
42 {
43 if(hashList[j]>=2 && 2*j+i==target)
44 {
45 result += hashList[i]*get(hashList[j],2);
46 result %= 1000000007;
47 // cout << i << " " << j << " " << j << endl;
48 }
49 if(hashList[j])
50 {
51 if(target-i-j > j && target-i-j <= 100 && hashList[target-i-j])
52 {
53 result += hashList[i]*hashList[j]*hashList[target-i-j];
54 result %= 1000000007;
55 // cout << i << " " << j << " " << target-i-j << endl;
56 }
57 }
58 }
59 }
60 }
61 result %= 1000000007;
62 return (int)result;
63 }
64 };