除数图中的最短路径


15

介绍

在这个挑战中,我们将处理某个无限的无向图,我将其称为高除数图。其节点是从2开始有两个节点之间的边缘的整数A <B ,如果一个分割b一个2 ≥b 。由2到18范围组成的子图如下所示:

16-8 12 18
  \|/ |/|
   4  6 9 10 15 14
   |  |/   |/   |
   2  3    5    7  11 13 17

可以证明无限高的除数图是连通的,因此我们可以询问两个节点之间的最短路径。

输入输出

您的输入是两个整数ab。您可以假定2≤a≤b <1000。您的输出是无限高除数图中ab之间的最短路径的长度。这意味着路径中的边数。

您可能会发现以下事实很有用:始终存在从ab的最佳路径,路径先增大然后减小,并且仅访问严格小于2b 2的节点。特别地,由于b <1000,您只需要考虑小于2000000的节点。

例子

考虑输入332。节点3和32之间的一条可能路径是

3 -- 6 -- 12 -- 96 -- 32

该路径有四个边,结果没有较短的路径,因此正确的输出是4

作为另一示例,用于最佳路径225

2 -- 4 -- 8 -- 40 -- 200 -- 25

因此正确的输出是5。在这种情况下,没有最佳路径包含node 50 = lcm(2, 25)

规则和计分

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。没有时间或内存限制,因此允许强行使用。

测试用例

2 2 -> 0
2 3 -> 4
2 4 -> 1
2 5 -> 5
3 5 -> 4
6 8 -> 2
8 16 -> 1
12 16 -> 2
16 16 -> 0
2 25 -> 5
3 32 -> 4
2 256 -> 3
60 77 -> 3
56 155 -> 3
339 540 -> 2
6 966 -> 4
7 966 -> 2
11 966 -> 4
2 997 -> 7
991 997 -> 4

我有一个想法,不是我想象的那样,它确实计算了两个数的最小倍数,将其逐渐乘以2的幂直到出现,然后逐渐除以sqrt直到出现第二个数,我没有时间立即实施iy:/
Abr001am '16

Zgarb,Mathematica是否FindShortestPath 违反了有关标准漏洞的约束?如果是这样,请告诉我,我将删除提交的内容。
DavidC '16

@DavidC我不认为这是漏洞。该相关答案实际上有一个得分为0
Zgarb

Answers:


4

MATLAB,218个 190 175字节

function f(a,b);q=a;l(b)=0;l(a)=1;while~l(b);x=q(1);q=q(2:end);l(end+1:x^2)=0;g=x+1:x^2;s=2:x-1;u=[g(~mod(g,x)),s(~mod(x,s)&s.^2>=x)];u=u(~l(u));q=[q,u];l(u)=l(x)+1;end;l(b)-1

感谢@beaker在列表延长步骤中提供的快捷方式!

这是一个相对简单的dijkstra实现:

q=a;                  %queue
l(b)=0;       %list of path lengths
l(a)=1;
while~l(b);         %if there is no predecessor to b
    x=q(1);         %get first queue element
    q=q(2:end);
    %add edges 
    l(end+1:x^2)=0;% lengthen predecessor list if too short
    g=x+1:x^2;      % g=greater neighbours
    s=2:x-1;        % s=smaller neighbours %keep only valid/unvisited neighbours 
    u=[g(~mod(g,x)),s(~mod(x,s)&s.^2>=x)]; %-1byte
    u=u(~l(u));
    q=[q,u];      %add only hte valid nodes edges to queue
    l(u)=l(x)+1;       %mark x as predecessor  
end;
l(b)-1 %output length to the end of the path

今天没有卷积


2
l=zeros(1,a*b);可以使用代替您的方法l(a*b)=0;,而是这样做
Luis Mendo

las ..在您身后还有10个字节长。
2016年

1

JavaScript(ES6),186个字节

(m,n)=>(g=i=>{for(q=[i],r=[],r[i]=j=0;i=q[j++];)for(k=i+i;k<=i*i&(k<m*m*2|k<n*n*2);k+=i)r[k]-r[i]<2?0:r[q.push(k),k]=r[i]+1},g(m),s=r,g(n),Math.min(...r.map((i,j)=>i+s[j]).filter(i=>i)))

使用辅助函数g来计算从提供的限制开始的所有上升路径,m然后n依次递增,直至达到所提供的极限,然后将这些路径加在一起并返回最小值。


1

Mathematica 98字节

我假设内置函数FindShortestPath不会违反有关标准漏洞的约束。如果有,请告诉我,我将删除此提交。

蛮力,因此在的值较大时变慢b。我仍在思考加快速度的方法。

h@{a_,b_}:=Length@FindShortestPath[Graph[Apply[Join,Thread[#<->Range[2,#] #]&/@Range[b^2]]],a,b]-1

这将建立一个图,在 ab^2FindShortestPath查找图中的最短路径。Length计算节点;Length -1是边数。

Thread[# <-> Range[2, #] #] &产生完整图形的边缘。例如, Thread[# <-> Range[2, #] #]&[5]将产生边缘{5 <-> 2*5, 5 <-> 3*5, 5 <-> 4*5, 5 <-> 5*5},即{5 <-> 10, 5 <-> 15, 5 <-> 20, 5 <-> 25}


1

Matlab的 (195)(185)(181)(179)(173)

注意:我本人是Agawa001用户,我证明我利用他的帮助赢得了@flawr用户

 function t(a,b,p),for r=0:1,d=(b*~r+r*a)/gcd(a,b);while(d>1)p=p+1;e=find(~rem(d,1:d));f=max(e(a^(1-r/2)>=e));a=a*min([find(1:a*a>=b) a])^~(f-1);d=d/f;a=a*f^(1-2*r);end,end,p
  • 此函数与其他函数不同,它确实遵循大量纯数学计算和因式分解,但与路径或图形无关。
  • 函数调用示例:

     t(2,3,0)
    
     p =
    
     4
    

    所有测试用例都满足

  • 说明:

在开始解释之前,让我们证明一些引理“不是绿色的”:

引理(1):任意两个数字之间的最优路径(a,b)以节点先增大后减小的方式存在。

为什么呢 可以简单地证明这一点,因为将任意数字相除的最大整数a分别与数字a本身一样大,因此,作为一种聪明的方法,我们必须选择a尽可能多地乘以使其足够大,然后再除以更大的值。如果我们一路做下去,数量a就会减少,因此我们不需要更多的迭代来逐渐增加它所需要的数量。

引理(2):从一个数字ab,如果gcd(a,b)=1 a乘以b,如果b大于a它将乘以一个已知数字c,如果gcd>1 a必须逐渐乘以验证条件的b/gcd具名最大除数,即所有最小大于,再次接收。da >= ddaaa*c

这个假设很容易证明任何起始节点都a必须相乘,直到达到最小倍数为止ab因此我们可以将b*gcd起始部分的比例乘以最大值,以验证主要条件,从而确保在除法过程开始之前始终有最短的smp路径,如果没有d可用的数字,则将其c乘以该第一阶段a的有效条件a>=d

引理(3):从一个图形的多个霉的ab,这个数量的GCD和bb本身

好吧,这只是先前操作的结果,最后剩下的步骤也逐步除以最大除数,该除数不超过其平方根。

难题:c要迭代乘以的最佳数字是多少a,将直接导致阶段1的开放条件,然后是最终数字?

很好的问题,对于任何简单的情况,都有一个简单的招架,因此假设一个两端(a,b)=(4,26)分解的示例如下:

  2 | 2
  2 | 13

除了gcd=2至极必须乘以最小整数2REACH法规137,但它显然是排除了,因为真的是大于2的,所以被平方。

  2 | 2 
  5 | 13

Appearenlty在第二示例(a,b)=(10,26)上述c被测量为从最低整数15超过13/5因此它满足图形缩放,这是条件3,所以下一步这里乘以3

  2 | 2 
  5 | 13
  3 |

为什么呢 这是因为,一旦我们必须乘以2*13/gcd=13匹配表的第二边,我们之前添加的垃圾量便会最小,并且如果我们乘以较大的值(例如10除以最少的时间减少了,它会再增加1个除法步数才能达到我们的目标2*13。列举为:13*2*5*10/2*5然后13*2*5/5。同时,显然这里要除以的数字是5*3<13*2

还有一件事........冰雹...


这些是我与@flawr的比较结果,只是要注意,我为时间执行设定了一个上限,因为它需要花费很多时间!

您可以将开始和结束扫描范围作为变量a和b插入在线可编译代码的标题中。


哇,这真令人惊讶。我没想到可以以简单的方式构造最佳路径。期待解释...
Zgarb

@Zgarb我在主要帖子评论中做了一个简单的解释,当我完成高尔夫球运动时,我会详细说明,顺便说一句,这是一个多么独特的挑战!
2016年

@Zgarb的证明是新鲜的烤箱!
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.