module main; // https://kmjp.hatenablog.jp/entry/2015/08/03/0930 より // 動的計画法 import std; char[] A, B; immutable MOD = 10L ^^ 9 + 7; // 最上位からの桁数、0-9の任意の値を取れるか否か、3が現れているかどうか、 // 各桁の和を3で割った余り、各桁の和を8で割った余り long[][][][][] dp; long calc(char[] V) { dp = new long[][][][][](10101, 2, 2, 3, 8); dp[0][0][0][0][0] = 1; auto v = V.map!(c => c - '0').array; foreach (d, c; v) { foreach (more; 0 .. 2) foreach (i3; 0 .. 2) foreach (m3; 0 .. 3) foreach (m8; 0 .. 8) foreach (x; 0 .. 10) { if (more == 0 && x > c) continue; (dp[d+1][more || (x