Polycarp loves geometric progressions very much. Since he was only three years old, he loves only the progressions of length three. He also has a favorite integer k and a sequence a, consisting of n integers.
He wants to know how many subsequences of length three can be selected from a, so that they form a geometric progression with common ratio k.
A subsequence of length three is a combination of three such indexes i1, i2, i3, that 1 ≤ i1 < i2 < i3 ≤ n. That is, a subsequence of length three are such groups of three elements that are not necessarily consecutive in the sequence, but their indexes are strictly increasing.
A geometric progression with common ratio k is a sequence of numbers of the form b·k0, b·k1, ..., b·kr - 1.
Polycarp is only three years old, so he can not calculate this number himself. Help him to do it.
InputThe first line of the input contains two integers, n and k (1 ≤ n, k ≤ 2·105), showing how many numbers Polycarp's sequence has and his favorite number.
The second line contains n integers a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — elements of the sequence.
OutputOutput a single number — the number of ways to choose a subsequence of length three, such that it forms a geometric progression with a common ratio k.
Sample test(s) input5 2 1 1 2 2 4output
4input
3 1 1 1 1output
1input
10 3 1 2 6 2 3 6 9 18 3 9output
6Note
In the first sample test the answer is four, as any of the two 1s can be chosen as the first element, the second element can be any of the 2s, and the third element of the subsequence must be equal to 4.
題意要求,給定一個數列,要求所有子序列(順序一定),長度為3的等比數列的個數。
設dp[i][4] 表示,值為i,已經形成1 2 3長度的序列的個數
則dp[i][1] = dp[i][1] + 1;
dp[i][2] = dp[i][2] + dp[j][1];
dp[i][3] = dp[i][2] + dp[j][2];(j * k = i);
由於i很大,所以用map存,復雜度為n * log(n) 注意要long long
#define N 1000005 #define M 1000005 #define maxn 205 #define MOD 1000000000000000007 int n,pri[N],k; struct node{ ll num[4]; }; mapmymap; map ::iterator it; int main() { while(S2(n,k)!=EOF) { mymap.clear(); FI(n) S(pri[i]); FI(n){ int t = pri[i] / k; if(pri[i] % k == 0 && mymap.count(t)){ node no = mymap[t]; node tn; if(mymap.count(pri[i])){ tn = mymap[pri[i]]; } else { tn.num[1] = 0; tn.num[2] = 0; tn.num[3] = 0; } tn.num[2] += no.num[1]; tn.num[3] += no.num[2]; mymap[pri[i]] = tn; } if(!mymap.count(pri[i])) { node no ; no.num[1] = 1;no.num[2] = 0;no.num[3] = 0; mymap[pri[i]] = no; } else { node tn = mymap[pri[i]]; tn.num[1]++; mymap[pri[i]] = tn; } } ll ans = 0; for(it = mymap.begin();it != mymap.end();it++){ node no = it->second; ans += (ll)no.num[3]; } cout<