100% faster.
Intuition\n Describe your first thoughts on how to solve this problem. \n\n# Approach\n Describe your approach to solving the problem. \n\n# Complexity\n- Time 
# Intuition\n<!-- Describe your first thoughts on how to solve this problem. -->\n\n# Approach\n<!-- Describe your approach to solving the problem. -->\n\n# Complexity\n- Time complexity:\n<!-- Add your time complexity here, e.g. $$O(n)$$ -->\n\n- Space complexity:\n<!-- Add your space complexity here, e.g. $$O(n)$$ -->\n\n# Code\n```\nclass Solution {\npublic:\n    long long getnum(vector<int>& arr1,vector<int>& arr2,vector<int>& arr3,vector<int>& arr4,long long num){\n        int i = 0;\n        int j = arr2.size()-1;\n        long long  cnt = 0;\n        while(i<arr1.size() and j>=0 and arr2.size()>0){\n            if(1l*arr1[i]*arr2[j]<=num){\n                i++;\n                cnt+=(j+1);\n            }\n            else j--;\n        }\n        i=0;j=arr4.size()-1;\n        while(i<arr3.size() and j>=0 and arr4.size()>0){\n            if(1l*arr3[i]*arr4[j]<=num){\n                i++;\n                cnt+=(j+1);\n            }\n            else j--;\n        }\n        \n        return cnt;\n    }\n    \n    long long kthSmallestProduct(vector<int>& nums1, vector<int>& nums2, long long k) {\n        \n        vector<int> pos1;\n        vector<int> neg1;\n        vector<int> pos2;\n        vector<int> neg2;\n        for(auto x:nums1){\n            if(x<0){\n                neg1.push_back(x);\n            }\n            else{\n                pos1.push_back(x);\n            }\n        }\n        for(auto x:nums2){\n            if(x<0){\n                neg2.push_back(x);\n            }\n            else{\n                pos2.push_back(x);\n            }\n        }\n        long long nofneg  = neg1.size() * pos2.size()  + neg2.size()*pos1.size();\n        bool iskneg = k>nofneg?false:true;\n        k = !iskneg?k-nofneg:k;\n        if(!iskneg){\n            reverse(neg1.begin(),neg1.end());\n            reverse(neg2.begin(),neg2.end());\n        }else{\n            reverse(pos1.begin(),pos1.end());\n            reverse(pos2.begin(),pos2.end());\n        }\n        long long low = -1e10,high = 1e10;\n        while(low<high){\n            long long mid = (long long)(low + (high-low)/2); \n            if(getnum(pos1,iskneg?neg2:pos2,neg1,iskneg?pos2:neg2,mid)>=k){\n                high = mid;\n            }else{\n                low = mid+1;\n            }\n            \n        }\n        return high;\n    }\n};\n```
['C++']