異或(xor,運算符號^
):按位計算,同0異1,1 ^ 0 = 1
,1 ^ 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...