1. 程式人生 > 其它 >藍橋杯 PREV-23 數字遊戲(等差數列)

藍橋杯 PREV-23 數字遊戲(等差數列)

技術標籤:演算法訓練藍橋杯演算法

藍橋杯 PREV-23 數字遊戲

試題 歷屆試題 數字遊戲
資源限制
時間限制: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

題解:由於資料規模較大,暴力列舉肯定會超時。考慮到每一圈所累加的數符合等差數列。即例子上的情況:

第一圈:1,2,3
第二圈:4,5,6

第n圈:1+3n,2+3n,3+3n
再由題上的限制進行取模即可。

AC程式碼:

#include<bits/stdc++.h>

using namespace std;
typedef long long int ll;

int main(){
  ios::sync_with_stdio(false);
  int n,k,t;
  cin>>n>>k>>t;
  ll sum=1;
  ll a1=1;
  ll an=n;
  int next=1;
  for(int i=1;i<t;
i++){ next=(next+(n*(a1+an)/2)%k)%k; sum+=next; a1=an+1; an=an+n; //cout<<next<<endl; } cout<<sum<<endl; system("pause"); return 0; }