1. 程式人生 > >[藍橋杯]PREV-23.歷屆試題_數字遊戲

[藍橋杯]PREV-23.歷屆試題_數字遊戲

正常 can 這樣的 分享 整數 藍橋 div 數字遊戲 累加

技術分享圖片
問題描述
  棟棟正在和同學們玩一個數字遊戲。

  遊戲的規則是這樣的:棟棟和同學們一共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 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main(void)
 6 {
 7     long long n,k,T;
 8     long long i,j,num,sum;
 9     scanf("%lld%lld%lld
",&n,&k,&T); 10 11 num=1,sum=0; 12 i=1,j=n; 13 while (T--) 14 { 15 sum += num; 16 num = (num + (i+j)*n/2)%k;//等差數列求的一輪的和 17 18 i = j+1;//本輪數列的頭 19 j = j+n;//本輪數列的尾 20 } 21 printf("%lld",sum); 22 23 return
0; 24 }
C解法

解題思路:

正常遍歷全部數據會超時,

觀察數據的增長,可以發現公差=1;

利用公差求和公式:Sn = n*(a1+an)/2 ;

計算得到每輪的和,遍歷T次並合並累加每輪的和,即為答案

[藍橋杯]PREV-23.歷屆試題_數字遊戲