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ぐらい削れないかなーと思うのだけど、思い付かず。うにゃあ。