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