3
long long int dp[11][2][2][(1 << 10)];4
int f(int idx, bool flag, bool repeat, int mask, string &s) {9
if (dp[idx][flag][repeat][mask] != -1) return dp[idx][flag][repeat][mask];11
int limit = s[idx] - '0';16
for (int digit = 0; digit <= limit; digit++) {17
if (digit < (s[idx] - '0')) {18
if (digit == 0 and mask == 0) {19
ans += f(idx + 1, true, false, mask, s);22
else if (mask & (1 << digit)) {23
ans += f(idx + 1, true, true, mask, s);25
ans += f(idx + 1, true, repeat, mask | (1 << digit), s);29
if (digit == 0 and mask == 0) {30
ans += f(idx + 1, flag, false, mask, s);33
else if (mask & (1 << digit)) {34
ans += f(idx + 1, flag, true, mask, s);36
ans += f(idx + 1, flag, repeat, mask | (1 << digit), s);41
return dp[idx][flag][repeat][mask] = ans;43
int numDupDigitsAtMostN(int n) {44
string r = to_string(n);45
memset(dp, -1, sizeof dp);47
return f(0, false, false, 0, r);