先找和数,再将和拆分为可反数,如两位数先找{11,33,……,99},再将其拆分(如99可拆分为18,27,……,81)。
沿着7楼思路继续往下,设a(n)a(n-1)...a1为n位可反数,其和为:(内积形式)
{a(n)+a1,a(n-1)+a2,...}.{10^(n-1)+1,10^(n-2)+10,...}
推理可知:
1:n为偶数时,每一个am+an都是不进位的奇数(也即是取值范围为Range[1,9,2]);
2:n为4K+3型数时,式中第一列表诸项取值范围为Range[11,17,2],Range[0,9]交替进行;
3:n为4K+1型数时无解。(所以,大家其实只需算到1亿……)
上代码:
Module[{dgts, idgts, list, listeven, listodd, count}, dgts[x_] := Min[x, 9] - Max[0, x - 9] + 1; idgts[x_] := If[3 <= x <= 17, Min[x - 1, 9] - Max[1, x - 9] + 1, 0]; listeven[n_] := Select[{Table[10^(n - 1 - i) + 10^i, {i, 0, (n - 1)/2}].#, n, #} & /@ Tuples[Range[1, 9, 2], Floor[(n + 1)/2]], And @@ OddQ /@ IntegerDigits[#[[1]]] &]; listodd[n_] := Select[{Table[10^(n - 1 - i) + 10^i, {i, 0, (n - 1)/2}].#, n, #} & /@ Tuples@Flatten[ Table[{Range[11, 17, 2], Range[0, 9]}, {i, Floor[(n + 1)/4]}], 1], And @@ OddQ /@ IntegerDigits[#[[1]]] &]; list[n_] := If[EvenQ@n, listeven[n], listodd[n]]; count[list_] := If[EvenQ@list[[2]], Times @@ Flatten[{idgts@list[[3, 1]], dgts /@ list[[3, 2 ;; -1]]}], Times @@ Flatten[{idgts@list[[3, 1]], dgts /@ list[[3, 2 ;; -2]]}] ]; Total[Total[count /@ list@#] & /@ Select[Range[4, 9], Mod[#, 4] != 1 &]] + 120 ] // Timing
如果被吞再看图片对照:
