yukicoder No.491 10^9+1と回文

解答

10^9+1の性質に着目します. 10^9+1にたとえば123456をかけると, 123456000123456になります. ほかの数値に対しても, 数値が左側と右側にコピーされているような感じになります. これに着目すると, 10^9+1が回文となる場合は, 回文を掛け算した場合のみであることがわかります.
与えられたNに対して M = \frac{N}{10^9+1} (小数点切捨)
としたMが, Nまでの10^9+1の倍数の数となります.
M以下の自然数であって回文であるようなものの数』が答えとなります.
回文の数を手元で概算すると, それほど多くないことに気づいたのですべてを列挙してソートし, 二分探索で数を数えることにしました.
回文の列挙は,
1桁, 2桁は自明
K桁目は, K-2,K-4,..(1 or 2)桁の回文を真ん中に置いて両サイドに1~9を置くことで生成することができます.
詳しいことは提出を見てください.

感想

C++において10E8は浮動小数点扱いされるので, 定数で割り算をして商を取りたいようなときに用いるとdouble型にすべてキャストされてしまい, 特に大きな数になってくると整数計算に誤差が出てしまいます. これをやらかし, なぞのWAに苦しんでいました.
これはなかなか気づかないので, 気を付けたいです.