Javaで1バイト減らすのって難しいですね♪
2506 -- Tiling
2*n(0<=n<=250)の長方形を1*2と2*2のタイルを使って敷き詰めるとき、何パターンあるかを数える問題。
BigIntegerマンセーなので、Javaで193byte。
どうみても漸化式です。
a(0)=1
a(1)=1
a(n+2)=a(n+1)+2a(n) (n>=0)
しかし、これでは一位になれなかったので、一般解を求める手段に出る。
a(n) = floor((pow(2,n+1)+1)/3)
Discussに書いてあった通りです。これを使って書くとこんなのになる。
import java.util.*; import java.math.*; class Main{ static{ for(Scanner s=new Scanner(System.in);s==s;) System.out.println(new BigInteger("2").pow(s.nextInt()+1).add(BigInteger.ONE).divide(new BigInteger("3"))); } }
つっこみどころが多すぎるのだけど、Scanner#nextInt()で例外が発生するまで無限ループという手はこの問題では通用せず、Runtime Errorとなった(ushioda氏やkosakも同じことやってるんじゃないでしょーか?)。
仕方ないので、無限ループをやめた上で一位になってみた。
import java.util.*; import java.math.*; class Main{ static{ for(Scanner s=new Scanner(System.in);s.hasNext();) System.out.println(BigInteger.ONE.setBit(s.nextInt()+1).divide(new BigInteger("3"))); } }
終わり。