编程历史的有趣问题
a=p1^a1+p2^a2+p3^a3……
b=p1^b1+p2^b2+p3^a3……
例如,6和21可以分解为
6=2^1+3^1+5^0+7^0……
21=2^0+3^1+5^0+7^1……
那么最大公约数= 2 (min (A1,B1))+3 (min (A2,B2))+5 (min (A3,B3))+7 (min (A4,B4))。
最小公倍数= 2 (Max (A1,B1))+3 (Max (A2,B2))+5 (Max (A3,B3))+7 (Max (A4,B4)) …
那么我们可以先把b1分解成素数因子,然后根据最大公约数和最小公倍数的指数关系进行搜索。
定义变量
p,x,c:数组[0..longint的1000];
a0,a1,b0,b1,I,j,k,m,tot,t,n:longint;
函数gcd(a,b:longint):longint;
开始
如果b=0那么exit(a) else exit(gcd(b,a mod b));
结束;
过程dfs(i,sum:longint);
定义变量
max,j:longint;
开始
如果我& gt那好吧
开始
Inc(tot);
p[tot]:= sum;
退出;
结束;
max:= sum;
dfs(i+1,最大);
for j:=1 to c[i] do
开始
max:= max * x[I];
dfs(i+1,最大);
结束;
结束;
程序工作(b:longint);
var i,p:longint;
开始
I:= 2;
p:= b;
而我& lt=sqrt(p) do
开始
如果p mod i=0,则
开始
Inc(m);
x[m]:= I;
c[m]:= 0;
重复
Inc(c[m]);
p:= p div I;
直到p mod i & lt& gt0;
结束;
inc(一);
结束;
如果p & lt& gt那么1
开始
Inc(m);
x[m]:= p;
c[m]:= 1;
结束;
dfs(1,1);
结束;
开始
readln(n);
对于i:=1到n do
开始
readln(a0,a1,b0,b 1);
fillchar(p,sizeof(p),0);
fillchar(x,sizeof(x),0);
fillchar(c,sizeof(c),0);
m:= 0;
tot:= 0;
t:= 0;
工作(b 1);
for j:=1 to tot do
if (gcd(p[j],a0)=a1)且((p[j] div gcd(p[j],b0) * b0)=b1)则Inc(t);
writeln(t);
结束;
结束。