#include <iostream>
#include<vector>
#include<map>
#define MAX 100007
using namespace std;
long long int ans = 0;
struct primeFactorization
{
int countOfPf, primeFactor;
};
int spf[MAX];
void calcSpf()
{
spf[1] = 1;
for (int i = 1; i < MAX; i++)
spf[i] = i;
for (int i = 4; i < MAX; i += 2)
spf[i] = 2;
for (int i = 3; i*i < MAX; i++)
{
if (spf[i] == i)
{
for (int j = i * i; j < MAX; j += i) // j+=i;
{
if ( j == spf[j] )
{
spf[j] = i;
}
}
}
}
}
void genDiv(vector<primeFactorization> a,long long int c,long long int d, map<int, int>* m1, map<int, int>* m2,int n)
{
if (c == a.size())
{
if ((*m1)[d] > 0 && (*m2)[n / d] > 0) // running twice !!
{
ans++;
}
//cout << d << " "; // if factor is 2 then remove n/2 also!!
return;
}
for (int i = 0; i <= a[c].countOfPf; i++)
{
genDiv(a, c + 1, d,m1,m2,n);
d *= a[c].primeFactor;
}
}
void find(int n, map<int, int>* m1, map<int, int>* m2)
{
long long int temp = (long long int)n * n;
vector<primeFactorization> a;
int count = 0;
for (int i = spf[n]; n != 1; i = spf[n])
{
count = 0;
while (n % i == 0)
{
n /= i;
count++;
}
a.push_back({ 2 * count, i });
}
long long int curIndex = 0, curDiv = 1;
genDiv(a, curIndex, curDiv, m1, m2, temp);
}
void solve(vector<int> v,map<int,int>* m1,map<int,int>* m2)
{
for (int i = 0; i < v.size(); i++)
{
find(v[i],m1,m2);
}
}
int main()
{
calcSpf();
int t;
cin >> t;
while (t--)
{
int n,m;
cin >> n >> m;
int xflag = 0,yflag = 0;
map<int, int> mxp, myp, mxn, myn;
vector<int> vxp, vxn, vyp, vyn;
//memset(mxp, 0, sizeof(mxp));
ans = 0;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
if (x > 0)
{
mxp[x]++;
vxp.push_back(x);
}
else if (x < 0)
{
mxn[-x]++;
vxn.push_back(-x);
}
else
xflag = 1;
}
for (int i = 0; i < m; i++)
{
int x;
cin >> x;
if (x > 0)
{
myp[x]++;
vyp.push_back(x);
}
else if (x < 0)
{
myn[-x]++;
vyn.push_back(-x);
}
else
yflag = 1;
}
solve(vxp, &myp, &myn);
solve(vxn, &myp, &myn);
solve(vyp, &mxp, &mxn);
solve(vyn, &mxp, &mxn);
if (xflag == 1)
{
ans += ((long long int)n - 1) * m;
}
else if (yflag == 1)
{
ans += n * ((long long int)m - 1);
}
cout << ans << endl;
}
}
Can someone tell me why the time limit is exceeding for this code?
Problem Link - https://www.codechef.com/problems/CHEFRAIL