<p>A <strong>good meal</strong> is a meal that contains <strong>exactly two different food items</strong> with a sum of deliciousness equal to a power of two.</p>

<p>You can pick <strong>any</strong> two different foods to make a good meal.</p>

<p>Given an array of integers <code>deliciousness</code> where <code>deliciousness[i]</code> is the deliciousness of the <code>i<sup>​​​​​​th</sup>​​​​</code>​​​​ item of food, return <em>the number of different <strong>good meals</strong> you can make from this list modulo</em> <code>10<sup>9</sup> + 7</code>.</p>

<p>Note that items with different indices are considered different even if they have the same deliciousness value.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> deliciousness = [1,3,5,7,9]
<strong>Output:</strong> 4
<strong>Explanation: </strong>The good meals are (1,3), (1,7), (3,5) and, (7,9).
Their respective sums are 4, 8, 8, and 16, all of which are powers of 2.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> deliciousness = [1,1,1,3,3,3,7]
<strong>Output:</strong> 15
<strong>Explanation: </strong>The good meals are (1,1) with 3 ways, (1,3) with 9 ways, and (1,7) with 3 ways.</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= deliciousness.length &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= deliciousness[i] &lt;= 2<sup>20</sup></code></li>
</ul>

class Solution {
public:

    const int mod = 1e9+7;

    int countPairs(vector<int>& deliciousness) {
        set<int> st;
        unordered_map<int,int> um;

        int maxVal = deliciousness[0];
        for(int i=0;i<deliciousness.size();i++) {
            um[deliciousness[i]]++;
            maxVal = max(maxVal,deliciousness[i]);
        }

        for(int i=1;i<=(1024*1024*4);i=(i*2)) {
            // cout<<i<<endl;
            st.insert(i);
        }


        int ans = 0;
        for(int i=0;i<deliciousness.size();i++) {
            um[deliciousness[i]]--;
            for(auto it=st.begin(); it != st.end(); it++) {
                int val = *it;
                int diff = val-deliciousness[i];
                if(diff < 0) continue;
                if(diff > maxVal) break;
                if(um[diff]>0) {
                    ans = (ans+um[diff])%mod;
                }
            }
        }

        return ans;
    }
};

// 1 4 9 16 25


// 1 2 3 6 9 12 19

// 1 2 14

// 1 2 4 8 16
// 1 7 1

//[1,1,7,1,3]
// 1 -> 3
// 7 -> 1
// 3 -> 1

// 2+1+1

// 1+1+1

// 1
// 1

// 1 7 1
// 1 -> 2
// 7 -> 1


// 1+1
// 1
// 
96933