java 數字遊戲

題目

問題描述
  棟棟正在和同學們玩一個數字遊戲。

  遊戲的規則是這樣的:棟棟和同學們一共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);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章