using
System;
using
System.Collections.Generic;
class
GFG{
static
readonly
int
MAXN = 100001;
static
int
[]spf =
new
int
[MAXN];
static
void
sieve()
{
spf[1] = 1;
for
(
int
i = 2; i < MAXN; i++)
spf[i] = i;
for
(
int
i = 4; i < MAXN; i += 2)
spf[i] = 2;
for
(
int
i = 3; i * i < MAXN; i++) {
if
(spf[i] == i) {
for
(
int
j = i * i; j < MAXN; j += i)
if
(spf[j] == j)
spf[j] = i;
}
}
}
static
int
getProductOddOccuringPrimes(
int
x)
{
if
(x == 1)
return
1;
List<
int
> ret =
new
List<
int
>();
while
(x != 1) {
ret.Add(spf[x]);
x = x / spf[x];
}
int
count = 1, ans = 1;
for
(
int
i = 0, j = 1; j < ret.Count; ++j, ++i) {
if
(ret[i] != ret[j]) {
if
(count % 2 == 1)
ans *= ret[i];
count = 0;
}
count++;
}
if
(count %2 == 1)
ans *= ret[ret.Count - 1];
return
ans;
}
static
void
printPairs(
int
n,
int
m,
int
[]a,
int
[]b)
{
int
countPairs = 0;
Dictionary<
int
, List<
int
>> productOfPrimes =
new
Dictionary<
int
, List<
int
>>();
for
(
int
i = 0; i < n; ++i) {
int
productPrimesOfA
= getProductOddOccuringPrimes(a[i]);
List<
int
> temp =
new
List<
int
>();
if
(productOfPrimes.ContainsKey(productPrimesOfA))
foreach
(
int
s
in
productOfPrimes[productPrimesOfA]){
temp.Add(s);
}
temp.Add(i);
if
(productOfPrimes.ContainsKey(productPrimesOfA))
productOfPrimes[productPrimesOfA] = temp;
else
productOfPrimes.Add(productPrimesOfA, temp);
}
for
(
int
i = 0; i < m; ++i)
{
int
productPrimesOfB
= getProductOddOccuringPrimes(b[i]);
if
(productOfPrimes.ContainsKey(productPrimesOfB)) {
foreach
(
int
itr
in
productOfPrimes[productPrimesOfB]) {
countPairs++;
Console.Write(
" ("
+ b[i]+
", "
+ a[itr]+
") "
);
}
}
}
if
(countPairs <= 0)
Console.Write(
"No pairs Found!"
);
Console.WriteLine();
}
public
static
void
Main(String[] args)
{
sieve();
int
N = 5, M = 5;
int
[]a = { 4, 1, 6, 35, 120 };
int
[]b = { 24, 140, 4, 30, 1 };
printPairs(N, M, a, b);
}
}