このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
下降階乗をnからk個取るとき、その値はn*(n-1)*...*(n-k+1)と定義される。これをn^^kと表記することにする。例えば7^^3=7*6*5=210であるし、n^^1=nである。次にこの定義を非正の整数kに対して拡張する。そのために(n-k)*(n^^k)=n^^(k+1)という事実を用いる。つまり、n^^k=(n^^(k+1))/(n-k)となる。これにより、以下のことが分かる。
- n^^0=n^^1/(n-0)=1
- n^^(-1)=n^^0/(n+1)=1/(n+1)
- n^^(-2)=1/(n+1)/(n+2)
- より一般にはn^^(-k)=1/(n+1)/(n+2)/.../(n+k)
私の解答はこちら。kの値で分岐して計算しています。
public class FallingFactorialPower {
public double compute(int n, int k) {
if( k==0 ){
return 1.0;
}else if( k>0 ){
double ret = 1.0;
for( int i=0 ; i<k ; i++ ){
ret *= (n-i);
}
return ret;
}else{
double ret = 1.0;
for( int i=0 ; i<Math.abs(k) ; i++ ){
ret /= (n+i+1);
}
return ret;
}
}
}
得点は237.85/250、1回のsubmitでシステムテストクリア。中央値は約205点。

0 件のコメント:
コメントを投稿