Python程式:求解由無限序列生成的向量的標量積


假設我們得到三個整數c、m和n。我們必須生成一個無限序列,其中第一個值為0,第二個值為c,從第三個值開始,它等於ki = (ki-2 + ki-1) mod m。我們必須生成序列中直到k2n+1項的所有值。現在,從序列的值中,我們將序列中兩個連續的值作為二維向量的x和y座標,並生成n個向量。需要注意的是,我們從序列的第三個值開始使用這些值。還有一個集合S,其中每個值都是向量i和向量j的標量積,其中1 <= i, j <= n且i != j。我們必須找出集合S中不同餘數的個數。如果值非常大,我們將它模m。

因此,如果輸入像5, 6, 4,則輸出將為3

生成的序列為:[0, 5, 5, 4, 3, 1, 4, 5, 3, 2]。

向量為:(5, 4), (3, 1), (4, 5), (3, 2)。

從向量的標量積來看,集合S中只有三個模6的餘數值。

因此結果是3 mod 6 = 3。

為了解決這個問題,我們將遵循以下步驟:

  • 如果n等於1,則
    • 返回0
  • 否則,
    • temp_arr := 一個大小為2*n+2的新列表,初始化為0
    • temp_arr[0] := 0
    • temp_arr[1] := c
    • arr2 := 一個新列表
    • 對於範圍從2到2 * n+2的i,執行:
      • temp_arr[i] := (temp_arr[i - 1] + temp_arr[i - 2]) mod m
    • 對於範圍從2到2 * n-2,步長為2的i,執行:
      • temp := (temp_arr[i] * temp_arr[i + 2] + temp_arr[i + 1] * temp_arr[i + 3]) mod m
      • 將temp新增到arr2的末尾
      • temp := (temp_arr[i] * temp_arr[i+4] + temp_arr[i+1] * temp_arr[i+5]) mod m
      • 將temp新增到arr2的末尾
    • temp := (temp_arr[2 * n-2] * temp_arr[2 * n] + temp_arr[2 * n-1] * temp_arr[2 * n+1]) mod m
    • 將temp新增到arr2的末尾
    • 從arr2中刪除重複項
    • 返回arr2的大小

示例

讓我們看看下面的實現以更好地理解:

def solve(c, m, n):
   if (n == 1):
      return 0
   else:
      temp_arr=[0 for i in range(2 * n+2)]
      temp_arr[0] = 0
      temp_arr[1] = c
      arr2 = []
      for i in range(2, 2 * n+2):
         temp_arr[i] = (temp_arr[i - 1] + temp_arr[i - 2]) % m
      for i in range(2, 2 * n-2, 2):
         temp = (temp_arr[i] * temp_arr[i + 2] + temp_arr[i + 1] * temp_arr[i + 3]) % m
         arr2.append(temp)
         temp = (temp_arr[i] * temp_arr[i+4] + temp_arr[i+1] * temp_arr[i+5]) % m
         arr2.append(temp)
      temp = (temp_arr[2 * n-2] * temp_arr[2 * n] + temp_arr[2 * n- 1] * temp_arr[2 * n+1]) % m
      arr2.append(temp)
      arr2 = set(arr2)
      return len(arr2)

print(solve(5, 6, 4))

輸入

5, 6, 4

輸出

3

更新於:2021年10月20日

121 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.