2011-10-09 (日)
*Code Jam...
Code Jam見直す.ついでに昨日の日記の所々に加筆.
昨日のCode JamのBの問題が気になって仕方ないので他の人のコードと比較していて間違いに気づいた.累乗の指数が周期より小さいときの場合を考慮していなかった.式考えているときは何か怪しいと思ってたのだけど,プログラム書いている間に忘れていた…….
うまく綺麗な式が立てられないので値が小さいときは単純に掛け算するように場合分け.
smallが正しい結果出すようになったので,large用も書き換えたら普通にいけた…….modpow()が遅いので書き直す予定だったけど,そのままでも十分間に合った.(本番だったら心配なので書き直してただろうけど)
最初無意味に再帰してたのだけど,遅すぎるので書き直す.
int calc(int a,int b, int c) { for (int i=1;i<=c;i++) { mm[0][i] = a%i; } int aa = a; for (int i=1;i<=b;i++) { for (int tc=1;tc<=c;tc++) { int ta = mm[i-1][tc]; auto cc = n(ta,tc); int r = mm[i-1][cc.second]; r = (r-cc.first + cc.second) % cc.second + cc.first; if (aa < tc) r = aa; mm[i][tc] = modpow(ta,r,tc); } if (aa <= 1000) { int td = aa; aa = 1; for (int tt=0;tt<td;tt++) { if (aa > 1000) break; aa*=td; } } } return mm[b][c]; }
A(small+large),B(small+large),C(small),D(small)あたりが出来れば良かったんだけどなぁ.
Dのlargeもよく考えたらクローゼットのサイズ2x1だしマップは5列かないし,2行ずつ決めてけば大丈夫だな….