[藍橋杯]PREV-23.歷屆試題_數字遊戲
阿新 • • 發佈:2019-03-22
正常 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%lldC解法",&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 return0; 24 }
解題思路:
正常遍歷全部數據會超時,
觀察數據的增長,可以發現公差=1;
利用公差求和公式:Sn = n*(a1+an)/2 ;
計算得到每輪的和,遍歷T次並合並累加每輪的和,即為答案
[藍橋杯]PREV-23.歷屆試題_數字遊戲