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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP