小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 ...