为什么这个数学模式出现在这里?

时间:2015-03-29 19:14:29

标签: algorithm math language-agnostic

实际问题是这样的

  

房间有N(1到N个)灯泡和N个开关。 N个人一个接一个地进去。第一个人进去   并且不切换任何开关。第二个人进入并切换所有   除了2(2,4,6 ......)的倍数以外的开关。第三个人进去了   并切换所有开关,而不是3的倍数(3,6,9 ......),等等   on(直到第N个人切换除第N个开关外的所有开关)。一旦   过程结束,有多少灯泡处于“开启”状态。 (假设   所有灯泡最初处于'关闭'状态。)

可以找到原始问题here

我首先尝试通过写一个强力求解器来解决它,但它会给我一个“超出时间限制”的判决,因为N可以和10E9一样大,

在测试某些N值的解决方案时,我找到了导致最终解决方案的模式

最好用图片解释,观察以0分隔的1的数字 - 2,4,6,8 ......

python brute solver

但我仍然无法弄清楚为什么这种模式存在?换句话说,这种模式背后的数学原因是什么?

这是我使用的draw(N)代码

def draw(N):
    arr=[0]*N
    for i in range(2,N+1):
        for j in range(0,N):
            if((j+1)%i!=0):
                arr[j]^=1
    print(N,arr)
    ans=0
    for i in range(0,N):
        if(arr[i]==1):
            ans+=1
    print(ans)

2 个答案:

答案 0 :(得分:5)

这是old puzzle的版本。通常的版本让第n个人翻转其数字可被n整除的开关,并产生相同的正方形图案(方形索引1,4,9,16的开关被切换),无论N是偶数还是奇数。在这里,恰好相反的开关被切换,这相当于将所有开关额外切换N次,如果N是偶数则不执行任何操作,并且当N为奇数时反转它们。您只显示N为奇数的情况,这意味着正方形是不改变状态的开关。

数字的因子成对出现,除非数字是正方形,因为我们可以将因子x与n / x配对,除非x ^ 2 = n,否则它们是不同的。

例如,18有6个因子:1和18,2和9,以及3和6.因此,如果您为每个因子切换一次开关18,它将保持原始状态。

100有9个因子:1和100,2和50,4和25,5和20,以及sqrt(100)= 10。因此,如果您为每个因素切换开关100一次,它会改变状态。

你提到了0之间的1的数量。 (n + 1)^ 2-n ^ 2 = 2n + 1。因此,你会看到N之间的0,4,6,8等1。

答案 1 :(得分:2)

道格拉斯·扎尔已经解释了与旧问题的关系,所以我只是详细解决旧问题的解决方案,无论如何,它的序列会显示在你的图像中。

我假设开关最初关闭(0),但无论如何推理都是相同的。第一个人将他们全部关闭。第二个人开启2 4 6 ...明显保持不变的是2,因为根据问题的规则,它永远不会被再次切换。

然后第三个人切换3 6 9 ...。再次,显然 3将继续保持。

然后第四个人切换4 8 12 ...显然 4会永远停留(第二个人已经开启)。

现在我们可以告诉你(如果你去第9个家伙可能会更明显)完美的方块将永远关闭,其余的将永远开启。这些陈述需要解释:

<强> 1。完美的方块将永远关闭

完美的正方形有很多因素:

x^2 = (p_1^e_1 * ... * p_k^e_k)^2
    = p_1^2e_1 * ... * p_k^2e_k,  p_i prime
divisors(x^2) = (2e_1 + 1)(2e_2 + 1)...(2ek + 1) = odd

number of divisors公式。

由于每个数字都被其除数切换,完美的方块总是会以初始状态结束,因为它们有一个奇数的除数。

<强> 2。不是完美正方形的数字将始终在

这是因为只有完美的正方形具有奇数个除数,所以其他数字总是与初始状态相反。

假设一个非完美的正方形具有奇数个除数。然后:

divisors(x) = (e_1 + 1)...(ek + 1) = odd
=> all e_k are even
=> we can write the number as (p_1^(e_1 / 2) * ... * p_k^(e_k / 2))^2
=> x is a perfect square, a contradiction.

然后问题的有效解决方案涉及找出n以下有多少完美正方形:sqrt(n)以下n个完美正方形,1, 2, ..., sqrt(n) - 1, sqrt(n)。< / p>