La pregunta de P1753HackSon en vijos es interesante, ¡gracias!
A=p1^a1+p2^a2+p3^a3......
B =p1 ^b1+p2^b2+p3^a3......
Por ejemplo, 6 y 21 se pueden descomponer en
6=2^1+3^ 1+5^ 7^0......
21=2^3^1+5^7^1......
Entonces el máximo divisor común = 2^ (min(a1,b1))+3^(min(a2,b2))+5^(min(a3,b3))+7^(min(a4,b4) )....
Mínimo común múltiplo=2^(max(a1,b1))+3^(max(a2,b2))+5^(max(a3,b3))+7 ^(max(a4, b4))...
Entonces primero podemos descomponer b1 en factores primos y luego encontrarlo en función de la relación entre el máximo común divisor y el mínimo común múltiplo en el exponente. .
var
p,x,c:array[0...1000] de entero largo;
a0,a1,b0,b1,i,j ,k,m,tot,t,n:longint;
función gcd(a,b:longint):longint
comenzar
if b=; 0 luego salir(a) else exit(gcd(b,a mod b));
end;
procedimiento dfs(i,sum:longint);
var
dfs(i+1,max);
para j:=1 a c[i] haga
comenzar
max:=max*x[i];
dfs(i+1,max);
fin;
fin;
procedimiento trabajo(b:longint);
var i,p:longint;
comenzar
i:=2;
p:=b;
mientras i<=sqrt(p) hago
comienzo
si p mod i=0 entonces
comenzar
inc(m);
x[m]:=i;
c[m]:=0;
repetir
inc(c[m]);
p:=p div i;
hasta p mod i<>0;
fin;
inc(i);
fin;
si p<>1 entonces
comienza p>
inc(m);
x[m]:=p;
c[m]:=1;
fin;
dfs(1,1);
fin;
comenzar
readln(n);
para i:=1 a n hacer
comenzar
readln(a0,a1,b0,b1);
fillchar(p ,sizeof( p),0);
fillchar(x,sizeof(x),0);
fillchar(c,sizeof(c),0);
m:=0;
tot:=0;
t:=0;
trabajo(b1).
para j:=1 tot do
if (gcd(p[j],a0)=a1) y ((p[j] div gcd(p[j],b0) * b0)=b1 ) luego inc(t);
writeln(t);
end;
end.