C語言實現 藍橋杯 歷屆試題 數字遊戲

試題 歷屆試題 數字遊戲

                                                                                  藍橋杯試題解答彙總鏈接

資源限制

       時間限制: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;

試題說明

棟棟的報數其實就是一個差等差數列,除了以下方法也可以直接手算出棟棟報數的公式。設爲an=an2+bn+c(a1=1),tn=an+1-an,tx=ax+d(t1=n*(n+1)/2,d=n2),這樣就可以直接求出an,我這裏只提供思路。

代碼

#include<stdio.h>
int main(){
	long long n,k,T,i,t=1,sum=1;
	scanf("%I64d%I64d%I64d",&n,&k,&T);
	for(i=1;i<T;i++){//棟棟的報數其實就是一個差等差數列它每次報數的差值爲等差數列n*n*(i-1)+n*(n+1)/2 
		t+=n*n*(i-1)+n*(n+1)/2;//t代表第i+1次棟棟的報數報數 
		t%=k;//對k取餘 
		sum+=t;
	}
	printf("%I64d",sum);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章