演算法 翻轉數列

2021-09-01 20:41:52 字數 1198 閱讀 2693

小q定義了一種數列稱為翻轉數列:

給定整數n和m, 滿足n能被2m整除。對於一串連續遞增整數數列1, 2, 3, 4..., 每隔m個符號翻轉一次, 最初符號為'-';。

例如n = 8, m = 2, 數列就是: -1, -2, +3, +4, -5, -6, +7, +8.

而n = 4, m = 1, 數列就是: -1, +2, -3, + 4.

小q現在希望你能幫他算算前n項和為多少。

輸入描述:

輸入包括兩個整數n和m(2 <= n <= 109, 1 <= m), 並且滿足n能被2m整除。

輸出描述:

輸出乙個整數, 表示前n項和。

輸入例子1:

8 2輸出例子1:

8

1. n能被2m整除,我們可以得出, n 為2m的整數倍,

2. 根據數列的規律,2m個元素的和為m^2

所以我們可以把n個元素劃分為多個2m元素組成的塊,x = n/(2*m),

那麼前n項的和可以看作這些塊的總和:s_n = x*m^2 = n/(2*m)*m^2 = n/2 * m

演算法的平均複雜度: o(n) = 1; 最壞情況下的複雜度為:o(n) = 1。

cpp實現

#include

using

namespace std;

long

sumn_reverse_permutation

(int n,

int m)

long num_2m = n /(2

*m);

long sum_n = num_2m * m * m;

return sum_n;

}int

main

(int argc,

char

** argv)

note:注意c++的int型別表示的數值範圍為:0~2^32次方,無法表示最後的儲存結果,同時如果計算的時候都是int型別的話,編譯器不會自動將型別轉換為long型別,需要將計算時的其中乙個元素定義為long型別,然後計算結果也儲存為long型別。

2018 04 05 Tencent翻轉數列

n是陣列長度 0 n 10 9 m是陣列中翻轉正負的間隔數 陣列中的基本元素是由1,2,3,4,5.組成的。且滿足n能被2m整除,即n 2m 0 求陣列中元素的和 示例 8 2 即 陣列應該是 1,2,3,4,5,6,7,8 第1,2.i.個數,i除以m 商.餘數 將商和餘數組成float型,向上取...

賽碼 翻轉陣列

題目描述 給定乙個長度為n的整數陣列a,元素均不相同,問陣列是否存在這樣乙個片段,只將該片段翻轉就可以使整個陣列公升序排列。其中陣列片段 l,r 表示序列a l a l 1 a r 原始陣列為 a 1 a 2 a l 2 a l 1 a l a l 1 a r 1 a r a r 1 a r 2 a...

翻轉陣列,來自賽碼網,初級演算法

翻轉陣列 題目描述 給定乙個長度為n的整數陣列a,元素均不相同,問陣列是否存在這樣乙個片段,只將該片段翻轉就可以使整個陣列公升序排列。其中陣列片段 l,r 表示序列a l a l 1 a r 原始陣列為 a 1 a 2 a l 2 a l 1 a l a l 1 a r 1 a r a r 1 a ...