/* 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 List
<Integer
> factors
(int n, Map
<Integer, Integer
> mp
) { List<Integer> factors = new ArrayList<Integer>();
for (int i=1;i*i<=n;i++) {
if (n%i==0) {
factors.add(i);
mp.put(i, mp.getOrDefault(i, 0) + 1);
if (i!=n/i) {
factors.add(n/i);
mp.put(n/i, mp.getOrDefault(n/i, 0) + 1);
}
}
}
return factors;
}
public List<Integer> factors(int n) {
List<Integer> result = new ArrayList<>();
for (int i=1;i*i<n;i++) {
if (n%i==0) {
result.add(i);
if (i!=n/i) {
result.add(n/i);
}
}
}
return result;
}
public int countPairInArrayWithGivenGCD(int[] arr, int gcdValue) {
Map
<Integer, Integer
> mp
= new HashMap
<>(); int maxVal=0;
for (int i=0;i<arr.length;i++) {
factors(arr[i], mp);
maxVal
= Math.
max(maxVal, arr
[i
]); }
int[] gcd = new int[maxVal+1];
for (int i=arr.length-1;i>=0;i--) {
int value = mp.get(arr[i]);
int countPair = (value * (value - 1)) / 2;
int sum = 0;
for (int j=arr[i];j<=arr[arr.length-1];j=j+arr[i]) {
sum = sum + gcd[j];
}
gcd[arr[i]] = countPair - sum;
}
return gcd[gcdValue];
}
public static void main
(String[] args
) { Ideone practice = new Ideone();
int count = practice.countPairInArrayWithGivenGCD(new int[]{1, 2, 4, 6, 8, 10, 11}, 2);
System.
out.
println("The count of pair having gcd value " + 2 + " is " + count
); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGZhY3RvcnMoaW50IG4sIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtcCkgewogICAgICAgIExpc3Q8SW50ZWdlcj4gZmFjdG9ycyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKICAgICAgICBmb3IgKGludCBpPTE7aSppPD1uO2krKykgewogICAgICAgICAgICBpZiAobiVpPT0wKSB7CiAgICAgICAgICAgICAgICBmYWN0b3JzLmFkZChpKTsKICAgICAgICAgICAgICAgIG1wLnB1dChpLCBtcC5nZXRPckRlZmF1bHQoaSwgMCkgKyAxKTsKICAgICAgICAgICAgICAgIGlmIChpIT1uL2kpIHsKICAgICAgICAgICAgICAgICAgICBmYWN0b3JzLmFkZChuL2kpOwogICAgICAgICAgICAgICAgICAgIG1wLnB1dChuL2ksIG1wLmdldE9yRGVmYXVsdChuL2ksIDApICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhY3RvcnM7CiAgICB9CiAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBmYWN0b3JzKGludCBuKSB7CiAgICAgICAgTGlzdDxJbnRlZ2VyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBmb3IgKGludCBpPTE7aSppPG47aSsrKSB7CiAgICAgICAgICAgIGlmIChuJWk9PTApIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoaSk7CiAgICAgICAgICAgICAgICBpZiAoaSE9bi9pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuL2kpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBwdWJsaWMgaW50IGNvdW50UGFpckluQXJyYXlXaXRoR2l2ZW5HQ0QoaW50W10gYXJyLCBpbnQgZ2NkVmFsdWUpIHsKICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgQXJyYXlzLnNvcnQoYXJyKTsKICAgICAgICBpbnQgbWF4VmFsPTA7CiAgICAgICAgZm9yIChpbnQgaT0wO2k8YXJyLmxlbmd0aDtpKyspIHsKICAgICAgICAgICAgZmFjdG9ycyhhcnJbaV0sIG1wKTsKICAgICAgICAgICAgbWF4VmFsID0gTWF0aC5tYXgobWF4VmFsLCBhcnJbaV0pOwogICAgICAgIH0KICAgICAgICBpbnRbXSBnY2QgPSBuZXcgaW50W21heFZhbCsxXTsKICAgICAgICBBcnJheXMuZmlsbChnY2QsIDApOwogICAgICAgIGZvciAoaW50IGk9YXJyLmxlbmd0aC0xO2k+PTA7aS0tKSB7CiAgICAgICAgICAgIGludCB2YWx1ZSA9IG1wLmdldChhcnJbaV0pOwogICAgICAgICAgICBpbnQgY291bnRQYWlyID0gKHZhbHVlICogKHZhbHVlIC0gMSkpIC8gMjsKICAgICAgICAgICAgaW50IHN1bSA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGo9YXJyW2ldO2o8PWFyclthcnIubGVuZ3RoLTFdO2o9aithcnJbaV0pIHsKICAgICAgICAgICAgICAgIHN1bSA9IHN1bSArIGdjZFtqXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnY2RbYXJyW2ldXSA9IGNvdW50UGFpciAtIHN1bTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdjZFtnY2RWYWx1ZV07CiAgICB9CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgSWRlb25lIHByYWN0aWNlID0gbmV3IElkZW9uZSgpOwogICAgICAgIGludCBjb3VudCA9ICBwcmFjdGljZS5jb3VudFBhaXJJbkFycmF5V2l0aEdpdmVuR0NEKG5ldyBpbnRbXXsxLCAyLCA0LCA2LCA4LCAxMCwgMTF9LCAyKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBjb3VudCBvZiBwYWlyIGhhdmluZyBnY2QgdmFsdWUgIiArIDIgKyAiIGlzICIgKyBjb3VudCk7CiAgICB9Cn0=