PKU JudgeOnline 2000 -- Gold Coins

課題が一段落したので(というか、今lilfesやる気がしないので)久々にショートコードを書きました。
CodeLength暫定トップになれたので、晒すことにします。

問題概要

  • 王様は金貨で騎士に賃金を与える。
  • お勤めの初日は日給が金貨1枚。
  • 次の2日間(2日目と3日目)は日給が金貨2枚。
  • その次の3日間(4日目と5日目と6日目)は日給が金貨3枚。
  • 以下同様に日給が上がっていく。
  • N日目のお勤めを終えた時点での騎士が得た金貨の総数を求めたい。

入力

  • 1行につき1つの整数N(0<=N<=10000)。
  • Nが0の行は入力の終端を表す。

出力

  • 各Nに対して1行出力する。
  • 各行のフォーマットは、[N][半角スペース][N日目を終えた時点での金貨の総数]。

サンプル入力

10
6
7
11
15
16
100
10000
1000
21
22
0

サンプル出力

10 30
6 14
7 18
11 35
15 55
16 61
100 945
10000 942820
1000 29820
21 91
22 98

ushiodaのコード

以下ネタバレ。
GCC。不要な改行・スペースを抜いて91byteでAccepted。

main(i, j, n){
  for(; j=n=scanf("%d", &i)&&i; printf("%d %d\n", i, n*i-j*(n-1)/3))
    for(; j<i; j+=++n);
}

あ、コード中のiは問題文中のNに対応してます。あしからず。
このコードは、
1+2+…+(n-1) < i <= 1+2+…+n
となるnを見つけて、答えは
1*1+2*2+…+(n-1)*(n-1) + (i-(1+2+…+(n-1)))*n
= n*(n-1)*(2*n-1)/6 + (i-n*(n-1)/2)*n
= n*i - n*(n-1)*(n+1)/6
で求まる、という計算方式で書かれてます。
どこかでもう1byteぐらい削れないかなーと思うのだけど、思い付かず。うにゃあ。