这题如果只问你取两个数乘积等于kk的方案数,那很明显第一反应就是二分(可以用lower_bound(),upper_bound()lower\_bound(),和upper\_bound())找到左端点和右端点,然后中间的数就是所求的等于kk的方案数了。那如果要求小于和大于其实也很简单,再此问题的基础上,左端点以前的都是小于的右端点以后的都是大于的,注意参数最好用1.0k/a[i]1.0*k/a[i]来判断端点即可。

//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<iomanip>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
//# include<unordered_map>

# define eps 1e-9
# define fi first
# define se second
# define ll long long
# define int ll
// cout<<fixed<<setprecision(n) 
using namespace std;
   
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=998244353;
const int MAX=3e5+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int n,m,k,T,res;
int a,b,c;
int va[MAX];
set<int>q;
map<int,int>mp;

void solve(){
	   cin >> n >> k;
	   for(int i = 1 ; i <= n ; i ++ ) cin >> va[i];
	   sort(va+1,va+1+n);
       for(int i = 1 ; i <= n ; i ++ ){
	   	    int l = lower_bound(va+i+1,va+1+n,1.0*k/va[i]) - va;
	   	    int r = upper_bound(va+i+1,va+1+n,1.0*k/va[i]) - va;
	   	    a += l - i - 1;
	   	    b += r - l ;
	   	    c += n - r + 1;
	   }
	   cout<<c<<" "<<b<<" "<<a;
}

signed main(){  
    std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    //cin >> T;
    T = 1;
    while(T--){
		solve();
	} 
    return 0; 
}