/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static int n = (int)1e6;
public static int N = 5;
public static long[] arr = {1, 36, 9, 4, 6};
public static long[] smallestPrimeFact = new long[n + 1];
public static long[] Prefix_Odd_Part = new long[N + 1];
public static void spf(){
for(int i = 2; i <= n; i++){
smallestPrimeFact[i] = i;
}
for(int i
= 2; i
<= Math.
sqrt(n
); i
++){ if(smallestPrimeFact[i] == i){
for(int j = i*i; j <= n; j += i){
if(smallestPrimeFact[j] == j){
smallestPrimeFact[j] = i;
}
}
}
}
}
public static HashMap
<Long, Long
> function
(long vl
){ HashMap
<Long, Long
> map
= new HashMap
<>();
while(vl != 1){
long d = smallestPrimeFact[(int)vl];
map.put(d, map.getOrDefault(d,0L) + 1);
vl /= d;
}
return map;
}
{
// your code goes here
Prefix_Odd_Part[0] = 1;
spf();
HashMap
<Long, Long
> map
= new HashMap
<>(); map.put(1L, 1L);
for(int i = 0; i < N; i++){
HashMap
<Long, Long
> k
= function
(arr
[i
]);
long oddPart = 1;
for(Map.
Entry<Long, Long
> en
: k.
entrySet()){ long key = en.getKey();
long freq = en.getValue();
if(freq % 2 != 0){
oddPart *= key;
}
}
long curr = Prefix_Odd_Part[i] * oddPart;
k = function(curr);
long preOddPart = 1;
for(Map.
Entry<Long, Long
> en
: k.
entrySet()){ long key = en.getKey();
long freq = en.getValue();
if(freq % 2 != 0){
preOddPart *= key;
}
}
Prefix_Odd_Part[i+1] = preOddPart;
count += map.getOrDefault(preOddPart, 0L);
map.put(preOddPart, map.getOrDefault(preOddPart, 0L) + 1);
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgaW50IG4gPSAoaW50KTFlNjsKCXB1YmxpYyBzdGF0aWMgaW50IE4gPSA1OwoJcHVibGljIHN0YXRpYyBsb25nW10gYXJyID0gezEsIDM2LCA5LCA0LCA2fTsKCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIHNtYWxsZXN0UHJpbWVGYWN0ID0gbmV3IGxvbmdbbiArIDFdOwoJcHVibGljIHN0YXRpYyBsb25nW10gUHJlZml4X09kZF9QYXJ0ID0gbmV3IGxvbmdbTiArIDFdOwoJCgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBzcGYoKXsKCWZvcihpbnQgaSA9IDI7IGkgPD0gbjsgaSsrKXsKCQkJc21hbGxlc3RQcmltZUZhY3RbaV0gPSBpOwoJCX0KIAoJCWZvcihpbnQgaSA9IDI7IGkgPD0gTWF0aC5zcXJ0KG4pOyBpKyspewoJCQlpZihzbWFsbGVzdFByaW1lRmFjdFtpXSA9PSBpKXsKCQkJCWZvcihpbnQgaiA9IGkqaTsgaiA8PSBuOyBqICs9IGkpewoJCQkJCWlmKHNtYWxsZXN0UHJpbWVGYWN0W2pdID09IGopewoJCQkJCQlzbWFsbGVzdFByaW1lRmFjdFtqXSA9IGk7IAoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KfQoJCglwdWJsaWMgc3RhdGljIEhhc2hNYXA8TG9uZywgTG9uZz4gZnVuY3Rpb24obG9uZyB2bCl7CgkJSGFzaE1hcDxMb25nLCBMb25nPiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CgkJCgkJd2hpbGUodmwgIT0gMSl7CgkJCWxvbmcgZCA9IHNtYWxsZXN0UHJpbWVGYWN0WyhpbnQpdmxdOwoJCQltYXAucHV0KGQsIG1hcC5nZXRPckRlZmF1bHQoZCwwTCkgKyAxKTsKCQkJdmwgLz0gZDsKCQl9CgkJcmV0dXJuIG1hcDsKCX0KCQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJCVByZWZpeF9PZGRfUGFydFswXSA9IDE7CgkJTG9uZyBjb3VudCA9IDBMOwoJCQoJCXNwZigpOwoJCQoJCUhhc2hNYXA8TG9uZywgTG9uZz4gbWFwID0gbmV3IEhhc2hNYXA8PigpOwoJCW1hcC5wdXQoMUwsIDFMKTsKCQlmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKXsKCQkJSGFzaE1hcDxMb25nLCBMb25nPiBrID0gZnVuY3Rpb24oYXJyW2ldKTsKCQkJCgkJCWxvbmcgb2RkUGFydCA9IDE7CgkJCQoJCQlmb3IoTWFwLkVudHJ5PExvbmcsIExvbmc+IGVuIDogay5lbnRyeVNldCgpKXsKCQkJCWxvbmcga2V5ID0gZW4uZ2V0S2V5KCk7CgkJCQlsb25nIGZyZXEgPSBlbi5nZXRWYWx1ZSgpOwoJCQkJCgkJCQlpZihmcmVxICUgMiAhPSAwKXsKCQkJCQlvZGRQYXJ0ICo9IGtleTsKCQkJCX0KCQkJfQoJCQkKCQkJbG9uZyBjdXJyID0gUHJlZml4X09kZF9QYXJ0W2ldICogb2RkUGFydDsKCQkJCgkJCSBrID0gZnVuY3Rpb24oY3Vycik7CgkJCSAKCQkJIGxvbmcgcHJlT2RkUGFydCA9IDE7CgkJCSAKCQkJIGZvcihNYXAuRW50cnk8TG9uZywgTG9uZz4gZW4gOiBrLmVudHJ5U2V0KCkpewoJCQkJbG9uZyBrZXkgPSBlbi5nZXRLZXkoKTsKCQkJCWxvbmcgZnJlcSA9IGVuLmdldFZhbHVlKCk7CgkJCQkKCQkJCWlmKGZyZXEgJSAyICE9IDApewoJCQkJCXByZU9kZFBhcnQgKj0ga2V5OwoJCQkJfQoJCQl9CgkJCQoJCQlQcmVmaXhfT2RkX1BhcnRbaSsxXSA9IHByZU9kZFBhcnQ7CgkJCQoJCQljb3VudCArPSBtYXAuZ2V0T3JEZWZhdWx0KHByZU9kZFBhcnQsIDBMKTsKCQkJbWFwLnB1dChwcmVPZGRQYXJ0LCBtYXAuZ2V0T3JEZWZhdWx0KHByZU9kZFBhcnQsIDBMKSArIDEpOwoJCX0KCQlTeXN0ZW0ub3V0LnByaW50bG4oY291bnQpOwoJfQp9