藍橋杯 歷屆試題 數字遊戲

2021-09-02 11:33:07 字數 1525 閱讀 1705

先看到資料規模,如果純暴力的話10^6 * 10^6肯定是要超時的,所以我們要想辦法優化,因為我們只關心棟棟報出的數字總和,我們又知道了其他人報的規律是前面乙個人的+1 +2 +3 +4這樣報的,那麼換句話來說,我們只要知道每迴圈一組總共加了多少,把這些總和加起來加到棟棟上次報的數字上,就能知道棟棟這次報的數字就多少了,再換句話說就是只需要等差數列求和就得出來了。

不考慮k的情況,假設有3個人報數

假定要知道第二個報的情況,只需要把這一輪的等差數列求和加到上次報的數字上就好了

然後忘記了等差數列的求和公式是什麼,就開始推,然後就想了一下比較經典的1+2+3+…+100那個,大概就推到首尾項相加乘個數除以二,得出n(a

n+a1

)/2n(a_n+a_1)/2

n(an​+

a1​)

/2,最後考慮k的情況,因為每次要報到k的時候從0開始報,實質上就是對k取餘,這也是寫這篇部落格的原因,因為大家都知道(a*b)%k=(a%k+b%k)%k,然後套上去的時候我一不小心對an和

a1a_n和a_1

an​和a1

​也取餘了,結果瘋狂wa,而且還能過部分資料不是全wa,當時還以為是我的求和公式推錯了,上網搜了一下發現也沒用我這種式子的(再次吐槽一下,好多人真的是複製貼上**就發部落格啊),那時候剛好在和乙個朋友聊天,然後朋友也說這個式子是可行的

最後就發現了是我手賤多打了兩個取餘,當然,至於(n(

a1%k

+an%

k)/2

)%k!

=sn%

k(n(a_1\%k+a_n\%k)/2)\%k!=s_n\%k

(n(a1​

%k+a

n​%k

)/2)

%k!=

sn​%

k這裡也是能通過數學證明的,這裡就不詳細展開了。

最後發一下ac**,這裡寫的稍微「囉嗦了點」,本來很多能省略的,例如a

na_n

an​是能通過a

1a_1

a1​推出來的,不過我覺得這樣寫也增加了可讀性,更符合數學公式

#include

using

namespace std;

long

long ans=

1,next_num=

1,total,an,a1;

intmain()

cout<

return0;

}

藍橋杯 歷屆試題 數字遊戲

這道題給了乙個很明顯的乙個序列,那麼就是數列可以一次寫為 1 0 1 0 1 1 0 1 2 1 0 1 2 3 1 0 1 2 n 1 這樣就轉化為1加上乙個等差數列,那麼直接按照等差數列求和公式sn a1 an n 2 這樣就很容易求出答案。但是中間用公式的時候會用到i n i n 1 注意i和...

藍橋杯 歷屆試題 數字遊戲

時間限制 1sec 記憶體限制 128mb 提交 612 解決 78 題目描述 棟棟正在和同學們玩乙個數字遊戲。遊戲的規則是這樣的 棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下乙個數字2。再下面的乙個同學要從上乙個同學說的數字往下數兩個數說出來,也就是說4...

1443 藍橋杯 歷屆試題 數字遊戲

為了使數字不至於太大,當在心中數到 k 1 時,下乙個數字從0開始數。ps 相當於取模 例如,當k 13時,棟棟和同學們報出的前幾個數依次為 1,2,4,7,11,3,9,3,11,7。遊戲進行了一會兒,棟棟想知道,到目前為止,他所有說出的數字的總和是多少。棟棟說出的數依次為1,7,9,和為17。資...