#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define br cout <<"\n";
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define tr(c,i) for(auto i : c)
#define pii pair< int,int >
#define fast_io() ios_base::sync_with_stdio(false);cin.tie(nullptr)
#define pq priority_queue< pair<ll,pii> ,vector<pair<ll,pii>>,greater <pair<ll,pii>> >p;//container adapter makes ascending q
using namespace std;
const int dx[] = { 1, -1 , 0 , 0 };
const int dy [] = { 0 ,0 , 1 , -1 };
const int MOD = 1000 * 1000 * 1000 + 7 ;
const int N = 4 ;
const int MAXN = 1000*100 + 5 ;
const int INF = INT_MAX ;
ll res = 0 ;
vector<int>spf(MAXN) ;
map<int , int >xmap ,ymap;
void precompute(){
iota( all(spf) , 0) ;
for (int i = 2 ; i < MAXN ; i+=2 )
spf[i] = 2 ;
for (int i = 3 ; i < MAXN ; i+=2 )
{ if (spf[i] == i ){
for (int j = 1 ; i*j < MAXN ; ++j )
spf[i*j] = min( spf[i * j ], i ) ;
}
}
}
vector<pair<int , int >> getPrime(ll x ){
map<int , int >prime ;
while (x != 1 )
{ prime[spf[x]]++ ;
x = x / spf[x] ;
}
return vector<pair<int,int >>(all(prime)) ;
}
void getValidPair(int k, ll cur , int idx , vector<pair<int,int >> &prime , map<int , int >&mp )
{ if (idx == (int)prime.size() )
{
// cout << cur << " " ;
auto curp = mp.find(cur );
auto curd = mp.find((1ll*k * k )/cur );
if (curp != mp.end() and curd != mp.end())
{
// cout << cur <<"---->";br
res ++ ;
}
// cur = -cur ;
// auto curn = mp.find( cur );
// curd = mp.find((-1ll* k * k )/cur );
// if (curn != mp.end() and curd != mp.end())
// {
// cout << cur <<"=====" << curd->ff ;br
// res++ ;
// }
return ;
}
ll num = prime[idx].ff , p = prime[idx].ss ;
for (int i = 0 ; i <= (p << 1 ) ; ++ i )
{
getValidPair(k , cur , idx+1 , prime ,mp );
cur *= num ;
}
}
void display(vector<pair<int , int >>&prime){
for (auto x : prime )
cout << x.ff <<" "<<x.ss <<"\n";
}
int main (){
precompute();
int t = 1 ;
// cin >> t ;
while (t--){
int n , m ;
cin >> n >> m ;
cout << n << " " << m ; br
vector<int>x, y;
bool zero = false ;
for (int i = 0 ; i < n ; ++ i ){
int inp ;
cin >> inp ;
if (inp)
{
x.pb(inp) ;
xmap[inp] ++ ;
}
else
{
zero = true ;
--n ;
}
}
for (int i = 0 ; i < m ; ++ i ){
int inp ;
cin >> inp ;
cout << inp ;
br
if(inp != 0 )
{
y.pb(inp) ;
ymap[inp]++ ;
}
else
{
zero = true ;
br
--m;
}
cout << i ;
}
if(zero)
res = n * m ;
cout << n << " "<< m ;
br
//y^2 = - (x1 * x2) ;
for (auto j : y ){
vector<pair<int , int >>prime = getPrime(abs(j));
//cout << j << "-------\n" ; display(prime) ;
//cout << "\nAll Divisors "<< j <<endl ;
getValidPair(j,1,0,prime,xmap);
}
//x^2 = - (y1 * y2 )
for (auto i : x ){
vector<pair<int , int >>prime = getPrime(abs(i));
//cout << i << "-------\n" ; display(prime) ;
//cout << "\nAll Divisors "<< i <<endl ;
getValidPair(i,1,0,prime,ymap);
}
cout << res ;
br
}
return 0 ;
}
// 2 year => 2 3 -> 6 5 1 5 5 1 5
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgIGxvbmcgbG9uZwojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIGZmIGZpcnN0CiNkZWZpbmUgc3Mgc2Vjb25kCiNkZWZpbmUgYnIgY291dCA8PCJcbiI7CiNkZWZpbmUgYWxsKHgpICAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSByYWxsKHgpICAoeCkucmJlZ2luKCksKHgpLnJlbmQoKQojZGVmaW5lIHRyKGMsaSkgZm9yKGF1dG8gaSA6IGMpCiNkZWZpbmUgcGlpIHBhaXI8IGludCxpbnQgPgojZGVmaW5lIGZhc3RfaW8oKSBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTtjaW4udGllKG51bGxwdHIpCiNkZWZpbmUgcHEgcHJpb3JpdHlfcXVldWU8IHBhaXI8bGwscGlpPiAsdmVjdG9yPHBhaXI8bGwscGlpPj4sZ3JlYXRlciA8cGFpcjxsbCxwaWk+PiA+cDsvL2NvbnRhaW5lciBhZGFwdGVyIG1ha2VzIGFzY2VuZGluZyBxCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBkeFtdID0geyAxLCAtMSAsIDAgLCAwICB9Owpjb25zdCBpbnQgZHkgW10gPSB7IDAgLDAgLCAxICwgLTEgIH07CmNvbnN0IGludCBNT0QgPSAxMDAwICogMTAwMCAqIDEwMDAgKyA3IDsKY29uc3QgaW50IE4gPSA0ICA7CmNvbnN0IGludCBNQVhOID0gMTAwMCoxMDAgKyA1IDsKY29uc3QgaW50IElORiA9IElOVF9NQVggOwpsbCByZXMgPSAwIDsgCnZlY3RvcjxpbnQ+c3BmKE1BWE4pIDsKbWFwPGludCAsIGludCA+eG1hcCAseW1hcDsKdm9pZCBwcmVjb21wdXRlKCl7Cglpb3RhKCBhbGwoc3BmKSAsICAwKSA7ICAKCWZvciAoaW50IGkgPSAyIDsgaSA8IE1BWE4gOyBpKz0yICkKCQlzcGZbaV0gPSAyIDsKCWZvciAoaW50IGkgPSAzIDsgaSA8IE1BWE4gOyBpKz0yICkKCXsJaWYgKHNwZltpXSA9PSBpICl7CgkJZm9yIChpbnQgaiA9ICAxIDsgaSpqIDwgTUFYTiA7ICsraiApCgkJCXNwZltpKmpdID0gbWluKCBzcGZbaSAqIGogXSwgaSApIDsKCQl9Cgl9CQp9CnZlY3RvcjxwYWlyPGludCAsIGludCA+PiBnZXRQcmltZShsbCB4ICl7CgltYXA8aW50ICwgaW50ID5wcmltZSAgOyAKCXdoaWxlICh4ICE9IDEgKQoJewlwcmltZVtzcGZbeF1dKysgOyAKCQl4ID0geCAvIHNwZlt4XSA7CgkJCQoJfQpyZXR1cm4gdmVjdG9yPHBhaXI8aW50LGludCA+PihhbGwocHJpbWUpKSA7IAoKCX0gCnZvaWQgZ2V0VmFsaWRQYWlyKGludCBrLCAgbGwgY3VyICwgaW50IGlkeCAsIHZlY3RvcjxwYWlyPGludCxpbnQgPj4gJnByaW1lICwgbWFwPGludCAsIGludCA+Jm1wICkKewlpZiAoaWR4ID09IChpbnQpcHJpbWUuc2l6ZSgpICApCgl7CgkJLy8gY291dCA8PCBjdXIgPDwgIiAiIDsgCgkJYXV0byBjdXJwID0gbXAuZmluZChjdXIgKTsKCQlhdXRvIGN1cmQgPSBtcC5maW5kKCgxbGwqayAqIGsgKS9jdXIgKTsKCQoJCWlmIChjdXJwICE9IG1wLmVuZCgpIGFuZCBjdXJkICE9IG1wLmVuZCgpKQoJCQl7CgkJCQkvLyBjb3V0IDw8IGN1ciA8PCItLS0tPiI7YnIKCQkJCXJlcyArKyA7CgkJCX0KCQkJCgkJLy8gY3VyID0gLWN1ciA7CQoJCS8vIGF1dG8gY3VybiA9IG1wLmZpbmQoIGN1ciApOwoJCS8vIGN1cmQgPSBtcC5maW5kKCgtMWxsKiBrICogayApL2N1ciApOwoJCgkJLy8gaWYgKGN1cm4gIT0gbXAuZW5kKCkgYW5kIGN1cmQgIT0gbXAuZW5kKCkpCgkJCS8vIHsKCQkJCS8vIGNvdXQgPDwgY3VyIDw8Ij09PT09IiA8PCBjdXJkLT5mZiA7YnIKCQkJCS8vIHJlcysrIDsKCQkJCS8vIH0gCgkJcmV0dXJuIDsgCgl9CglsbCBudW0gPSBwcmltZVtpZHhdLmZmICwgcCA9IHByaW1lW2lkeF0uc3MgOyAJCQkKCWZvciAoaW50IGkgPSAwIDsgaSA8PSAocCA8PCAxICkgOyArKyBpICkgCgl7CgkJZ2V0VmFsaWRQYWlyKGsgLCBjdXIgLCBpZHgrMSAsIHByaW1lICxtcCApOwoJCWN1ciAqPSBudW0gOyAJCgl9CQp9IAp2b2lkIGRpc3BsYXkodmVjdG9yPHBhaXI8aW50ICwgaW50ID4+JnByaW1lKXsKZm9yIChhdXRvIHggOiBwcmltZSApCmNvdXQgPDwgeC5mZiA8PCIgIjw8eC5zcyA8PCJcbiI7Cgl9CmludCBtYWluICgpewoKcHJlY29tcHV0ZSgpOwoKIAoKaW50IHQgPSAxIDsKLy8gY2luID4+IHQgOwp3aGlsZSAodC0tKXsKaW50IG4gLCBtIDsKY2luID4+IG4gPj4gbSA7CmNvdXQgPDwgIG4gPDwgIiAiIDw8IG0gOyBicgp2ZWN0b3I8aW50PngsIHk7CmJvb2wgemVybyA9IGZhbHNlIDsKZm9yIChpbnQgaSA9IDAgOyBpIDwgbiA7ICsrIGkgICl7CglpbnQgaW5wIDsgCgljaW4gPj4gaW5wIDsKCSAKCWlmIChpbnApCQkKCXsKCQl4LnBiKGlucCkgOwoJCXhtYXBbaW5wXSArKyA7ICAKCX0gCgllbHNlCgl7CgkJemVybyA9IHRydWUgOyAKCQktLW4gOwoJfQoJIAoJfQoKZm9yIChpbnQgaSA9IDAgOyBpIDwgbSA7ICsrIGkgICl7CglpbnQgaW5wIDsgIAoJY2luID4+IGlucCA7Cgljb3V0IDw8IGlucCA7CgliciAKCWlmKGlucCAhPSAwICkKCXsKCQl5LnBiKGlucCkgOyAKCQl5bWFwW2lucF0rKyA7IAoJfQoJZWxzZQoJewoJCXplcm8gPSB0cnVlIDsKCQliciAKCQktLW07CgkJCgl9Cgljb3V0IDw8IGkgOwoJfQoJaWYoemVybykgCglyZXMgPSBuICogbSA7Cgljb3V0IDw8IG4gPDwgIiAiPDwgbSA7CglicgoJCgkKCS8veV4yID0gLSAoeDEgKiB4MikgOyAgICAgCgkJZm9yIChhdXRvIGogOiB5ICl7CgkJCXZlY3RvcjxwYWlyPGludCAsIGludCA+PnByaW1lID0gZ2V0UHJpbWUoYWJzKGopKTsgCgkJCS8vY291dCA8PCBqIDw8ICItLS0tLS0tXG4iIDsgZGlzcGxheShwcmltZSkgOwoJCQkvL2NvdXQgPDwgIlxuQWxsIERpdmlzb3JzICI8PCBqIDw8ZW5kbCAgOyAKCQkJZ2V0VmFsaWRQYWlyKGosMSwwLHByaW1lLHhtYXApOyAKCX0KCQoJLy94XjIgPSAtICh5MSAqIHkyICkKCQlmb3IgKGF1dG8gaSA6IHggKXsKCQkJdmVjdG9yPHBhaXI8aW50ICwgaW50ID4+cHJpbWUgPSBnZXRQcmltZShhYnMoaSkpOwoJCQkvL2NvdXQgPDwgaSA8PCAiLS0tLS0tLVxuIiA7IGRpc3BsYXkocHJpbWUpIDsKCQkJLy9jb3V0IDw8ICJcbkFsbCBEaXZpc29ycyAiPDwgaSA8PGVuZGwgIDsgCgkJCWdldFZhbGlkUGFpcihpLDEsMCxwcmltZSx5bWFwKTsgCgl9CgoKCmNvdXQgPDwgcmVzIDsKYnIJCn0KCgogCgoKcmV0dXJuIDAgOwogCn0KCi8vIDIgeWVhciA9PiAyIDMgLT4gNiA1IDEgNSA1IDEgNSAK