PKU2680

http://acm.pku.edu.cn/JudgeOnline/problem?id=2680
まぁ問題文の詳しい説明は省略。
今回は多倍長演算問題なので打倒Javaを目標にコード短縮。目標達成したので公開
まだ無駄があるようなないような


この手の問題はどうやって計算するかでコードの長さの大部分が決まります。
そのため、どの数式で答えを出すかがショートコードでは非常に重要となります。
今回、自分が選んだのは漸化式で出す方法です。


さて、この問題の答えは以下の漸化式で求められます。

a_{1} = 0
a_{n} = 2a_{n-1} + (-1)^n

また、この式の(-1)^nの部分は多倍長演算のcarry部分に突っ込めば無駄なく処理できます。


では後は具体的なコードで。

char*c;v,t[1025][99];
main(n){
	for(;n<<22;v=n%2*2-1,strrev(t+n++))
		for(396[c=t+n]=48;*c|v;v/=10)
			c++[396]=(v+=*c*2%48)%10+48;
	while(~scanf("%d",&n))puts(t-~n);
}

自分でも、もはや何をしているのかわからないカオスコードです。
前半部はTLE回避のために配列にcacheする部分。
後半部は配列上のデータを順に表示するだけです。