anarchy golf - Hamming Numbers
撃沈した。
90Bあたりを境に完全にアルゴリズムが違う気がする。
90B切りたい…現時点では100B切るので精一杯かorz
98Bコード
a,s;main(k,i){ for(scanf("%d",&i);i;k+=s>5||printf("%d\n",k)|i--) for(a=1,s=k;++a<6;)s%a||(s/=a--); }
追記:完全にネタバレ
ハミング数で調べてみると最小公倍数を利用してうんぬんという記述を発見した。
(a^x) mod x == 0 のときxはハミング数らしい。この場合の最小公倍数は30なので (30^x) mod x になります。
これを利用したコードも書いてみたのだけど、短くならなかった。まだ検討する余地はありそう
109Bコード
c;M(a,b){return b-1?(M(a,b-1)*a)%c:a;} main(i){ for(c=scanf("%d",&i);i;c++) c-1&&M(30,c)?:printf("%d\n",c)|i--; }
さらに追記:
上記のコードが無駄ありまくりだったので、それを省くと99Bにはなった。
わざわざ再帰で書く必要なくね?とループで処理させたら短くなったあああ。
93B
a,c,i;main(s){ for(c=scanf("%d",&i);i;s=s||i--|printf("%d\n",c),c++) for(a=c;a--;s%=c)s*=30%c; }