試題 歷屆試題 數字遊戲

2022-06-05 05:36:09 字數 2167 閱讀 6377

資源限制

時間限制:1.0s   記憶體限制:256.0mb

問題描述

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

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

為了使數字不至於太大,棟棟和同學們約定,當在心中數到 k-1 時,下乙個數字從0開始數。例如,當k=13時,棟棟和同學們報出的前幾個數依次為:

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;

思路

我原是想直接用公式來算出棟棟說的每個數字,然後對它們取模並相加,由題意可知,每個人說出的數(未對k取模的)之間的差值數列正好是公差為1的等差數列,那麼每個人說出的數剛好可以用等差數列和的公式計算,即:si = 1+i+i*(i-1)/2. 那麼棟棟說的數就是 si*n (i=0, 1, 2, , ,).

但是寫完提交之後才發現s可能會超出long long範圍,最後乙個測試用例沒過,只有83分,**如下——

1 #include 2 #include 3 #include 4

5using

namespace

std;

6 typedef long

long

ll;7

8int

main()

17 cout18return0;

19 }

於是就換了種思路,不直接套那個公式了,而是借助求出的棟棟說的前乙個數來計算當前棟棟說的數,這樣資料就不會超出long long範圍了,具體分析如下——

當n=3,k=13時,棟棟和同學們報出的前幾個數依次為:1, 2, 4,7, 11, 3,9, 3, 11,7.

i=0: s0=1;

i=1: sn=s0+(1+2+3)=7;··········a1=1, b1=a1+n-1=3;

i=2: s2n=(sn+(4+5+6))%k=22%13=9; ····a2=a1+n=4, b2=b1+n=6;

i=3: s3n=(s2n+(7+8+9))%k=33%13=7;····a3=a2+n=7, b3=b2+n=9;

……i=m: sin=(s(i-1)n+(ai+...+bi))%k = (s(i-1)n

+(ai+bi)

*n/2)%k;(標紅部分是等差數列,用等差數列求和公式計算)

1 #include 2 #include 3 #include 4

5using

namespace

std;

6 typedef long

long

ll;7

8int

main()

20 cout21return0;

22 }

歷屆試題 數字遊戲

歷屆試題 數字遊戲 時間限制 1.0s 記憶體限制 256.0mb 問題描述 棟棟正在和同學們玩乙個數字遊戲。遊戲的規則是這樣的 棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下乙個數字2。再下面的乙個同學要從上乙個同學說的數字往下數兩個數說出來,也就是說4。...

歷屆試題 數字遊戲

問題描述 棟棟正在和同學們玩乙個數字遊戲。遊戲的規則是這樣的 棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下乙個數字2。再下面的乙個同學要從上乙個同學說的數字往下數兩個數說出來,也就是說4。下乙個同學要往下數三個數,說7。依次類推。為了使數字不至於太大,棟棟...

歷屆試題 數字遊戲

問題描述 棟棟正在和同學們玩乙個數字遊戲。遊戲的規則是這樣的 棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下乙個數字2。再下面的乙個同學要從上乙個同學說的數字往下數兩個數說出來,也就是說4。下乙個同學要往下數三個數,說7。依次類推。為了使數字不至於太大,棟棟...