ARC075 F 「Mirrored」 速い解法

ARC075F

とりあえず桁数を1~18まで全部試します。
例えば6桁なら、

D
= fedcba - abcdef
= 99999*(f-a)
  +9990*(e-b)
  + 900*(d-c)

となるようなa~f(0≦a~f≦9, a≠0)の個数を数えれば良いです。
(f-a),(e-b),(d-c)みたいに端から決めていくんですが、
解説ではDとの差を縮めていくようなものを探索していますが、
下の位のmodに注目すると、実は(f-a),(e-b),(d-c)の組み合わせは一意に決めていけることが分かります。
例えば(f-a)を決める時は、99999*(f-a)%10 == D%10 とならないといけなくて、「0≦abs(f-a)≦9」と「999999*2>(9990+900)*9(つまり2ずれると収拾がつかなくなる)」に注意するとそういう(f-a)は一意に定まります。
(e-b)を決める時は (9990*abs(e-b)%100 == abs(D-99999*(f-a))%100) みたいな感じでどんどんやっていきます。符号はどっちかだけが正しいです。
計算量は O(log^2 D) とかです。

ソースコード