http://codeforces.com/contest/567/problem/C
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
__int64 n,k;
__int64 a[100000*2+5];
__int64 b[100000*2+5]; //记录i位置的数对应 有多少个 a[i]/k 存在
map <int ,__int64 > c;
int main()
{
__int64 i;
scanf("%I64d%I64d",&n,&k);
for (i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
if (a[i]%k==0) //如果能整除
b[i]=c[a[i]/k]; //记录当前位置 拥有多少个 a[i]/k (等比的前一项)
c[a[i]]++; //每次把a[i]个数加一
}
c.clear(); //c已经clear 和之前没关系了
__int64 ans=0;
for (i=1;i<=n;i++)
{
if (a[i]%k==0)
ans+=c[a[i]/k]; //a[i]为第三项,a[i]/k为第二项,c[a[i]/k]存的是(每一个(第二项对应的第一项)的个数)之和
c[a[i]]+=b[i]; //c[a[i]] 存的是 数a[i] 对应的 a[i]/k 的个数
}
printf("%I64d\n",ans);
return 0;
}