等差數列異或和的小規律

2021-10-07 20:04:54 字數 915 閱讀 1521

異或(xor,運算符號^):按位計算,同0異1,1 ^ 0 = 11 ^ 1 = 0,如此。

現定義等差數列1, 2, ... , n異或和f(n) = 1 ^ 2 ^ ... ^ n,求f(n)的值。

我們很容易想到質樸的實現如下:

int

func

(int n)

return xor_sum;

}

時間複雜度o(n),空間複雜度此處沒有太大必要討論。

聯想到等差數列的四則運算都是有求和公式的,那麼異或運算有沒有呢?直接這麼看也看不出來,先輸出個十來項看看規律:

int a=

;// 1 3 0 4 1 7 0 8 1 11 0 12 1 15 0 16 1 19

注釋中分別是從第1項到第18項的異或和。這個規律其實非常明顯了,拋開前2個結果不看,後面4個為一組,定義為m組,通式如下:

// n=3, 0   n=7, 0      n=4m-1, 0

// n=4, 4 n=8, 8 n=4m, 4m

// n=5, 1 n=9, 1 n=4m+1, 1

// n=6, 7 n=10, 11 n=4m+2, 4m+3

從n>=3開始,後面的異或和的取值都是固定的常量或者公式求得。優化後實現如下:

int

func

(int n)

}}

時間複雜度o(1) ,部分**為了體現公式沒有精簡,主要操作就是取餘。

這樣能提公升不少效能。

Seq(規律 等差數列)

剛開始我還沒什麼頭緒,估計一看就是規律吧,結果打了一下表 然後發現這樣寫 然後很明顯的等差數列就出來了,最後通式一帶判斷一下餘數和計算行數就ac了 include include include include include include include include include incl...

尋找最長的等差數列

問題描述 給定乙個大小為n的陣列,要求寫出乙個演算法,求出其最長的等差數列的子串行。首先問題並沒有要求要按照原來陣列的順序,所以可以先對該陣列排序。如果不要求該最長子序列中的元素是相鄰的話,可以用乙個簡單的dp來完成。令 f i j 表示以 i 為結尾的某子串行 該子串行的等差為 j 的最大長度 那...

尋找最長的等差數列

題目描述 description 給定n 1 n 100 個數,從中找出盡可能多的數使得他們能夠組成乙個等差數列.求最長的等差數列的長度.輸入描述 input description 第一行是乙個整數n,接下來一行包括了n個數,每個數的絕對值不超過10000000.輸出描述 output descr...