编程历史的有趣问题

根据最小公倍数和最大公约数的特殊关系,对素因子指标进行分解优化。比如两个数,下面的公式可以通过分解质因数得到。

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);

结束;

结束。