題目
問題描述
棟棟正在和同學們玩一個數字遊戲。
遊戲的規則是這樣的:棟棟和同學們一共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;
思路
java中long的範圍
long最大值是9223372036854775807(2^64-1),
long最小值是-9223372036854775808(-2^64)。
根據樣例寫出
**1** 2 4 **7** 11 3 **9** 3 11 **7**……
+1+2+3 +4+5+6 +7+8+9
有上述數據可得,棟棟每次說出的數字爲1+(1+n)*n/2,每n個一組,不斷更新l和r,當加數大於k-1時對k取餘(因爲當在心中數到 k-1 時,下一個數字從0開始數)。
代碼
import java.io.BufferedInputStream;
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(new BufferedInputStream(System.in));
long n,k,t;
while(sc.hasNext()){//相當於!=EOF
n=sc.nextLong();
k=sc.nextLong();
t=sc.nextLong();
long x=1,ans=1,l=1,r=n;
for(int i=1;i<t;i++){
x+=(l+r)*n/2;
x%=k;
ans+=x;
l=1+i*n;
r=n+i*n;
}
System.out.println(ans);
}
}
}