public class Solution { public int solve(ArrayList<Integer> A, int B, int C) { int size = A.size(); if (size == 0) return 0; String Cstr = String.valueOf(C); int Clength = Cstr.length(); if (B > Clength) return 0; if (B < Clength) { if (A.get(0) != 0 || B == 1) { return (int) Math.pow(size, B); } else { return (size - 1) * (int) Math.pow(size, B - 1); } } if (B == Clength) { int[] lower = new int[11]; for (int i = 0; i < size; i ++) { lower[A.get(i) + 1] ++; } for (int i = 1; i <= 10; i ++) { lower[i] += lower[i - 1]; } int[] dp = new int[B + 1]; boolean addLower = true; Set<Integer> set = new HashSet<>(A); for (int i = 1; i <= B; i ++) { int c = Cstr.charAt(i - 1) - '0'; dp[i] = dp[i - 1] * size; if (addLower) { dp[i] += lower[c]; addLower = set.contains(c); } if (i == 1 && B != 1 && A.get(0) == 0) { dp[i] -= 1; } } return dp[B]; } return 0; } }