數字遊戲(1 43) 等差數列 o n

2021-10-20 02:55:14 字數 1461 閱讀 3647

棟棟正在和同學們玩乙個數字遊戲。

遊戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下乙個數字2。再下面的乙個同學要從上乙個同學說的數字往下數兩個數說出來,也就是說4。下乙個同學要往下數三個數,說7。依次類推。

1, 2, 4, 7, 11, 3, 9, 3, 11, 7。

遊戲進行了一會兒,棟棟想知道,到目前為止,他所有說出的數字的總和是多少。

輸入的第一行包含三個整數 n,k,t,其中 n 和 k 的意義如上面所述,t 表示到目前為止棟棟一共說出的數字個數。

輸出一行,包含乙個整數,表示棟棟說出所有數的和。

3 13 3
17
棟棟說出的數依次為1, 7, 9,和為17。

資料規模和約定:

1 < n,k,t < 1,000,000;

ecnu_dase_oj_1-43

常規思想:從第乙個數開始,後乙個數比前乙個數的增量,是乙個1、2、3…n的等差數列,可以通過列舉的方法,求每一輪棟棟說的數,然後計算起來,這樣時間複雜度為o(n*t),近似為o(n^2)。

由於增量之間時按1、2、3、…n的等差數列排布,由第一輪棟棟說的數字初始值為1,求下一輪棟棟說的數值,沒必要使用迴圈列舉,可利用等差數列的性質,直接用公式求得下一輪的棟棟的數字,公式為(首項+尾項)*項數/2,即(首項+首項+n-1)*n/2,所以每次我們只需套這個公式,但要用乙個數+n記為下一輪的首項,按題目描述的例子可計算第二輪棟棟的數字1+(1+3)*3/2=7,第三輪的數字為7+(4+6)*3/2=22,22>12,22%13=9,故棟棟三輪說的數字總和為1+7+9=17。該演算法的時間複雜度為o(t)。

注意:在題目描述中,說一旦說出的數字超過k-1,就從0開始,等價於一旦數字超過k,對k取餘。還有,沒必要等到說出的數字超過k時對k取餘,當數字遞增計算到一輪棟棟說出的數字時(假設此時數字非常巨大,遠遠大於k),此時對k取餘正是棟棟這輪說出的數字。因為數字做減法,所以這要做得到的數字是正確的。一開始受這個條件干擾思維固化,很容易寫成o(n^2)演算法的**,數字一超過k就對其取餘,顯然這是不正確的。

時間複雜度:o(n^2)

該**在t,n<104下可以執行,當t,n的資料過大n*t的積超過108,oj系統會超時。

#include

intmain()

c++;}

printf

("%lld\n"

,sum)

;return0;

}

時間複雜度:o(n)
#include

//由於運算都涉及long long,故全部使用long long型別

intmain()

printf

("%lld\n"

,sum)

;return0;

}

45 等差數列

45 等差數列 問題描述 乙個等差數列是乙個能表示成a,a b,a 2b,a nb n 0,1,2,3,在這個問題中a是乙個非負的整數,b是正整數。寫乙個程式來找出在雙平方數集合s中長度為n的等差數列。雙平方數集合是所有能表示成p2 q2的數的集合。輸入說明 第一行 n 3 n 25 要找的等差數列...

45 等差數列

乙個等差數列是乙個能表示成a,a b,a 2b,a nb n 0,1,2,3,在這個問題中a是乙個非負的整數,b是正整數。寫乙個程式來找出在雙平方數集合s中長度為n的等差數列。雙平方數集合是所有能表示成p2 q2的數的集合。第一行 n 3 n 25 要找的等差數列的長度。第二行 m 1 m 250 ...

45 等差數列

45 等差數列 問題描述 乙個等差數列是乙個能表示成a,a b,a 2b,a nb n 0,1,2,3,在這個問題中a是乙個非負的整數,b是正整數。寫乙個程式來找出在雙平方數集合s中長度為n的等差數列。雙平方數集合是所有能表示成p2 q2的數的集合。輸入說明 第一行 n 3 n 25 要找的等差數列...